prendre possession d’un fichier c #

J’essaie de prendre possession d’un fichier et de le supprimer via C #. Le fichier est iexplorer.exe, propriétaire actuel par défaut – TrustedInstaller. La méthode FileSecurity.SetOwner semble définir la propriété spécifiée, mais ne change pas le propriétaire initial et ne lève pas d’exception. Évidemment, la prochaine tentative de suppression du fichier lève une exception. Qu’est-ce qui devrait être changé dans le code pour devenir propriétaire du fichier et le supprimer?

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"); 

Vous devez explicitement activer SeTakeOwnershipPrivilege :

Requis pour s’approprier un object sans bénéficier d’un access discrétionnaire. Ce privilège permet de définir la valeur de propriétaire uniquement sur les valeurs que le titulaire peut légitimement atsortingbuer en tant que propriétaire d’un object. Droit d’utilisateur: Prendre possession de fichiers ou d’autres objects.

Je vous suggère de lire l’excellent article de Mark Novak: Manipuler les privilèges dans le code géré de manière fiable, sécurisée et efficace .

Et / ou regardez son échantillon .

Mettre à jour

Exemple d’utilisation:

 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"); 
  ssortingng 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); 

Ajouter les importations suivantes

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

Exécutez le code en mode élevé.

Propulsé par Windows 8.1 à l’aide de la classe Privilège de l’exemple: Manipuler des privilèges dans du code géré de manière fiable, sécurisée et efficace

  private bool TryDeleteFile(ssortingng fileName) { ssortingng 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; }