Ho l’obbligo di leggere e visualizzare il proprietario di un file (a scopo di controllo) e potenzialmente di modificarlo (questo è un requisito secondario). Ci sono dei buoni wrapper in C #?
Dopo un rapido google, ho trovato solo la soluzione WMI e un suggerimento per PInvoke GetSecurityInfo
Non c’è bisogno di P / Invoke. System.IO.File.GetAccessControl restituirà un object FileSecurity , che ha un metodo GetOwner .
Modifica: leggere il proprietario è piuttosto semplice, anche se è un po ‘ingombrante dell’API:
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
L’impostazione del proprietario richiede una chiamata a SetAccessControl per salvare le modifiche. Inoltre, sei ancora vincolato dalle regole di proprietà di Windows: non puoi assegnare la proprietà a un altro account. Puoi dare la proprietà di acquisto e devono assumerne la proprietà.
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; }