Приобретение права собственности на файл или папку - PullRequest
8 голосов
/ 20 марта 2011

Прежде чем вырвать оставшуюся часть моих волос, я хотел бы получить некоторую информацию об этом.
Я пытаюсь стать владельцем папки. Конечно, я запускаю программу от имени администратора и у меня есть права на владение, поскольку я могу сменить владельца в проводнике.

Однако я могу сменить владельца, если он принадлежит администратору или моей учетной записи, и я могу изменить разрешения, если у меня уже есть владелец.
Если я попытаюсь присвоить себе файл, скажем, принадлежащий 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 ]

10 голосов
/ 20 мая 2011

У меня была такая же проблема, и я просто отправляю сюда кого-нибудь, кто может прийти сюда в поисках, как я:

Вам необходимо явно включить SeTakeOwnershipPrivilege в коде, как упоминал Люк выше.Я обнаружил, что Process Privileges очень полезен при работе с подобными вещами.

Вот как это исправило мой код:

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);    
}
1 голос
/ 20 марта 2011

Вы сначала повысили уровень своего процесса с помощью UAC?В Windows 7 без эскалации UAC ваш процесс выполняется с маркером с более низким уровнем привилегий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...