2008-09-30 25 views
24

Tengo un requisito para leer y mostrar el propietario de un archivo (para fines de auditoría), y posiblemente cambiarlo también (este es un requisito secundario). ¿Hay algún buen envoltorio de C#?Obteniendo/configurando el propietario del archivo en C#

Después de una rápida de Google, que se encuentra sólo the WMI solution y una sugerencia para PInvoke GetSecurityInfo

+0

Véase también http://stackoverflow.com/questions/5241718/taking-ownership-of-files-with-broken-permissions y http://stackoverflow.com/questions/5368825/taking-ownership- of-a-file-or-folder –

Respuesta

42

No hay necesidad de P/Invoke. System.IO.File.GetAccessControl devolverá un objeto FileSecurity, que tiene un método GetOwner.

Editar: Lectura del propietario es bastante simple, aunque es un poco de una API engorroso:

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 

Ajuste del propietario requiere una llamada a SetAccessControl para guardar los cambios. Además, aún está sujeto a las reglas de propiedad de Windows; no puede asignar la propiedad a otra cuenta. Puede otorgar permisos permanentes a la propiedad, y ellos deben asumir la propiedad.

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

Cuando intento esto, simplemente devuelve "\\ BUILTIN \ Administrators" como el propietario. Aunque en el explorador muestra al propietario como mi inicio de sesión en el dominio correcto, etc. –

Cuestiones relacionadas