Ответ 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;
}