2008-09-30 15 views
24

J'ai besoin de lire et d'afficher le propriétaire d'un fichier (à des fins d'audit), et éventuellement de le modifier (c'est une exigence secondaire). Y a-t-il de beaux wrappers C#?Obtention/définition du propriétaire du fichier en C#

Après un rapide Google, je trouve que the WMI solution et une suggestion de PInvoke GetSecurityInfo

+0

Voir aussi http://stackoverflow.com/questions/5241718/taking-ownership-of-files-with-broken-permissions et http://stackoverflow.com/questions/5368825/taking-ownership- d'un fichier ou d'un dossier –

Répondre

42

Pas besoin de P/Invoke. System.IO.File.GetAccessControl va retourner un objet FileSecurity, qui a une méthode GetOwner.

Edit: La lecture du propriétaire est assez simple, mais il est un peu d'une API lourde:

const string FILE = @"C:\test.txt"; 

var fs = File.GetAccessControl(FILE); 

var sid = fs.GetOwner(typeof(SecurityIdentifier)); 
Console.WriteLine(sid); // SID 

var ntAccount = sid.Translate(typeof(NTAccount)); 
Console.WriteLine(ntAccount); // DOMAIN\username 

Réglage du propriétaire exige un appel à SetAccessControl pour enregistrer les modifications. De plus, vous êtes toujours lié par les règles de propriété de Windows - vous ne pouvez pas attribuer de propriété à un autre compte. Vous pouvez donner des permissions permanentes, et elles doivent en prendre possession.

var ntAccount = new NTAccount("DOMAIN", "username"); 
fs.SetOwner(ntAccount); 

try { 
    File.SetAccessControl(FILE, fs); 
} catch (InvalidOperationException ex) { 
    Console.WriteLine("You cannot assign ownership to that user." + 
    "Either you don't have TakeOwnership permissions, or it is not your user account." 
    ); 
    throw; 
} 
+4

Lorsque j'essaie cela, il renvoie simplement "\\ BUILTIN \ Administrators" en tant que propriétaire. Même si dans l'explorateur, il montre le propriétaire comme ma connexion sur le bon domaine, etc. –

Questions connexes