Получение/установка владельца файла в С#

У меня есть требование прочитать и отобразить владельца файла (для целей аудита) и, возможно, изменить его (это вторичное требование). Есть ли красивые С# обертки?

После быстрого google я нашел только решение WMI и предложение PInvoke GetSecurityInfo

Ответ 1

Не нужно P/Invoke. System.IO.File.GetAccessControl вернет объект FileSecurity, который имеет GetOwner метод.

Изменить: чтение владельца довольно просто, хотя это немного громоздкий 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

Настройка владельца требует вызова SetAccessControl для сохранения изменений. Кроме того, вы по-прежнему связаны правилами владения Windows - вы не можете назначить право собственности на другую учетную запись. Вы можете дать владение перми, и они должны взять на себя ответственность.

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;
}