Приобретение права собственности на файл или папку
Прежде чем вырвать остальную часть моих волос, я хотел бы получить некоторую информацию об этом.
Я пытаюсь стать владельцем папки. Конечно, я запускаю программу от имени администратора и у меня есть права на владение, поскольку я могу сменить владельца в проводнике.
Однако я могу сменить владельца, если он принадлежит администратору или моей учетной записи, и я могу изменить разрешения, если у меня уже есть владелец.
Если я попытаюсь присвоить себе файл, скажем, принадлежащий SYSTEM, то получу исключение от несанкционированного доступа.
Я пробовал разные вещи с методами accesscontrol, но ничего не работает, этот последний метод, я думаю, прямо в книге.
private static void makePerm(string file, NTAccount account)
{
FileInfo finfo = new FileInfo(file);
FileSecurity fsecurity = finfo.GetAccessControl();
//also tried it like this //fsecurity.ResetAccessRule(new FileSystemAccessRule(string.Format(@"{0}\{1}", Environment.UserDomainName.ToString(), Environment.UserDomainName.ToString()), FileSystemRights.FullControl, AccessControlType.Allow));
fsecurity.SetOwner(account);
finfo.SetAccessControl(fsecurity);
}
Я пытаюсь это на Windows 7, кстати.
Что мне здесь не хватает?
2 ответа
У меня была такая же проблема, и я просто писал здесь для всех, кто может прийти сюда в поисках, как я:
Вам нужно явно включить SeTakeOwnershipPrivilege в коде, как упоминал Люк выше. Я считаю, что Привилегии Процесса действительно полезны для решения подобных проблем.
Вот как это исправило мой код:
using System;
using System.Diagnostics;
// ...
using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
{
directoryInfo = new DirectoryInfo(path);
directorySecurity = directoryInfo.GetAccessControl();
directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
Directory.SetAccessControl(path, directorySecurity);
}
Вы подняли свой процесс через UAC в первую очередь? В Windows 7 без эскалации UAC ваш процесс выполняется с маркером с более низким уровнем привилегий.