Как дать полное разрешение на файл, созданный моим приложением для ВСЕХ пользователей? - PullRequest
67 голосов
/ 02 февраля 2012

Инструмент, который я разрабатываю, должен предоставить права доступа «Полный доступ» к созданному им файлу. Это должно быть прочитано, изменено и удалено из всех учетных записей Windows и даже возможных будущих учетных записей. Может ли это быть достигнуто?

Я знаю, что могу попробовать это для SPECIFIC_USER:

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(filePath);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(filePath, fSecurity);

Но как я могу предоставить его всем пользователям? И даже возможные будущие счета? Если последняя часть невозможна, как выполнить первое требование?

Спасибо.

РЕДАКТИРОВАТЬ:

Это код, который работал для меня. Взято из ссылки ответчика.

private bool GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
        FileSystemRights.FullControl,
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

    dInfo.SetAccessControl(dSecurity);
    return true;
}

Обратите внимание на PropagationFlags.NoPropagateInherit, который требуется (упомянуто в конце последнего в ссылке). Это дает привилегию даже будущим учетным записям.

Ответы [ 2 ]

114 голосов
/ 25 апреля 2013

Примечание для людей, использующих это.

При использовании буквенных строк для FileSystemAccessRule, оно должно быть WellKnownSidType.WorldSid вместо "everyone".

Причина в том, что существует несколько языков Window, и каждый относится только к EN, поэтому для испанского языка это может быть "Todos" (или что-то еще).

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
}
13 голосов
/ 02 февраля 2012

Вам нужно будет предоставить полный контроль группе «Все» на машине.Нашел этот пост в MSDN, в котором говорится об этом.

Надеюсь, это работает для вас.

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