2012-10-21 20 views
5

Próbuję przejąć na własność plik i usunąć go przez C#. Plik to iexplorer.exe, obecny właściciel domyślnie - TrustedInstaller. Metoda FileSecurity.SetOwner wydaje się ustawić określone własności, ale w rzeczywistości nie zmienia właściciela początkowego i nie rzuca wyjątku. Oczywiście następna próba usunięcia pliku zgłasza wyjątek. Co należy zmienić w kodzie, aby przejąć na własność plik i go usunąć?przejmij na własność plik C#

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 
fileS.SetOwner(new System.Security.Principal.NTAccount(Environment.UserDomainName, Environment.UserName)); 
File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 
+2

Co się dzieje z UAC tutaj? Czy biegasz wysoko? –

+0

Tak i nie pomaga. Musisz ustawić uprawnienia, a następnie usunąć podany plik. Rozwiązanie jest dostępne tutaj: http://msdn.microsoft.com/en-us/magazine/cc164701.aspx?code=true&level=root%2cPrivilege11 – alternative

Odpowiedz

4

Musisz jawnie włączyć SeTakeOwnershipPrivilege:

Wymagane przejąć na własność obiektu bez przyznania uznaniowe dostępu. To uprawnienie umożliwia ustawienie wartości właściciela na tylko dla tych wartości, które właściciel może zgodnie z prawem przypisać jako właściciela obiektu. User Right: Przejmij własność plików lub innych obiektów .

Proponuję przeczytać wspaniały artykuł napisany przez Marka Novaka: Manipulate Privileges in Managed Code Reliably, Securely, and Efficiently.

I/lub spójrz na jego sample.

Aktualizacja

Przykład użycia:

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 

Privilege p; 
bool ownerChanged = false; 
try 
{ 
    p = new Privilege(Privilege.TakeOwnership); 
    p.Enable(); 

    fileS.SetOwner(new System.Security.Principal.NTAccount(
     Environment.UserDomainName, Environment.UserName)); 

    ownerChanged = true; 
} 
catch(PrivilegeNotHeldException e) 
{ 
    // privilege not held 
    // TODO: show an error message, write logs, etc. 
} 
finally 
{ 
    p.Revert(); 
} 

if (ownerChanged) 
    File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 
+0

Dzięki, Nikolay. Czyjś kod działa nadal jest mile widziany. – alternative

+0

@atywna Moja odpowiedź zawiera link do implementacji klasy "Privilege" przez Marka wraz z przykładowym kodem. Myślę, że nie powinienem kopiować i wklejać tutaj 1k linii kodu. Chociaż zaktualizowałem swoją odpowiedź przy użyciu przykładów. –

+0

Link do artykułu jest uszkodzony, ale nadal możesz go pobrać w formularzu CHM, przewijając do końca tej strony: https://msdn.microsoft.com/magazine/msdn-magazine-issues i klikając marzec 2005. Po zapisaniu kliknij na niego i we właściwościach musisz odblokować, w przeciwnym razie pojawi się puste. Również kod źródłowy jest połączony z CHM w pliku .exe wszystkich rzeczy, wygląda na to, że musi zostać zainstalowany z jakiegokolwiek powodu. – TripleAntigen

1
 string filepath = @"C:\Program Files (x86)\Internet Explorer\iexplore.exe"; 

     //Get Currently Applied Access Control 
     FileSecurity fileS = File.GetAccessControl(filepath); 

     //Update it, Grant Current User Full Control 
     SecurityIdentifier cu = WindowsIdentity.GetCurrent().User; 
     fileS.SetOwner(cu); 
     fileS.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.FullControl, AccessControlType.Allow)); 

     //Update the Access Control on the File 
     File.SetAccessControl(filepath, fileS); 

     //Delete the file 
     File.Delete(filepath); 

Dodaj następujące importu

 using System.IO; 
     using System.Security.AccessControl; 
     using System.Security.Principal; 

uruchomić kod w trybie podwyższony.

1

Powered Windows 8.1 przy użyciu klasy Privilege z przykładu: Manipulate Privileges in Managed Code Reliably, Securely, and Efficiently

private bool TryDeleteFile(string fileName) 
    { 
     string filePath = Path.GetFullPath(fileName); 
     var fi = new FileInfo(filePath); 

     bool ownerChanged = false; 
     bool accessChanged = false; 
     bool isDelete = false; 

     FileSecurity fs = fi.GetAccessControl(); 
     Privilege p = new Privilege(Privilege.TakeOwnership); 

     try 
     { 
      p.Enable(); 
      fs.SetOwner(WindowsIdentity.GetCurrent().User); 
      File.SetAccessControl(filePath, fs); //Update the Access Control on the File 
      ownerChanged = true; 
     } 
     catch (PrivilegeNotHeldException ex) { } 
     finally { p.Revert(); } 

     try 
     { 
      fs.SetAccessRule(new FileSystemAccessRule(WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, AccessControlType.Allow)); 
      File.SetAccessControl(filePath, fs); 
      accessChanged = true; 
     } 
     catch (UnauthorizedAccessException ex) { } 

     if (ownerChanged && accessChanged) 
     { 
      try 
      { 
       fi.Delete(); 
       isDelete = true; 
      } 
      catch (Exception ex) { } 
     } 

     return isDelete; 
    } 
Powiązane problemy