Добавить привилегию «Все» в папку с помощью C#.NET

Я использовал приведенный ниже код, чтобы разрешить всем доступ к папке:

System.Security.AccessControl.DirectorySecurity sec =
    System.IO.Directory.GetAccessControl(directory, AccessControlSections.All);
FileSystemAccessRule accRule = new FileSystemAccessRule("Everyone",
                                       FileSystemRights.Modify,
                                       AccessControlType.Allow);
sec.AddAccessRule(accRule);    // setACL
sec.ResetAccessRule(accRule);

Теперь в папку добавлен пользователь Everyone, но без назначенных прав. Все флажки чтения, записи, выполнения и т. д. не отмечены.


person Suresh Chaudhary    schedule 14.03.2011    source источник
comment
вам не хватает вызова SetAccessControl? msdn.microsoft.com/en-us/library/   -  person Massif    schedule 14.03.2011
comment
Я сделал это, но все еще правый флажок не отмечен.   -  person Suresh Chaudhary    schedule 14.03.2011
comment
Обратите внимание, что AccessControlSections.All обычно требует привилегий администратора, иначе вы можете получить исключение с этим сообщением: Процесс не обладает привилегией SeSecurityPrivilege, которая требуется для этой операции. Поскольку вы меняете правила доступа (а не аудит), используйте AccessControlSections.Access.   -  person tachylatus    schedule 23.06.2017


Ответы (3)


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

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

Затем я написал этот код C#, чтобы точно указать, какие параметры мне нужны для дублирования настроек Windows:

string path = @"C:\Users\you\Desktop\perms"; // path to directory whose settings you have already correctly configured
DirectorySecurity sec = Directory.GetAccessControl(path);
foreach (FileSystemAccessRule acr in sec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) {
    Console.WriteLine("{0} | {1} | {2} | {3} | {4}", acr.IdentityReference.Value, acr.FileSystemRights, acr.InheritanceFlags, acr.PropagationFlags, acr.AccessControlType);
}

Это дало мне эту строку вывода:

Everyone | Modify, Synchronize | ContainerInherit, ObjectInherit | None | Allow

Таким образом, решение простое (но трудно найти правильное решение, если вы не знаете, что искать!):

DirectorySecurity sec = Directory.GetAccessControl(path);
// Using this instead of the "Everyone" string means we work on non-English systems.
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
Directory.SetAccessControl(path, sec);

Это приведет к тому, что флажки в диалоговом окне безопасности Windows будут соответствовать тому, что вы уже установили для своего тестового каталога.

person Yoshi    schedule 22.03.2011
comment
Обратите внимание, что Everyone не будет работать в неанглийских версиях Windows. Вместо этого вы должны использовать System.Security.Principal.WellKnownSidType.WorldSid. - person Rory; 22.06.2011
comment
@Rory: спасибо за это - потому что у меня это не работало со всеми (на немецком сервере Windows 2008) - но с WellKnownSidType это работало отлично - person bernhardrusch; 03.04.2013
comment
Я рекомендую запускать этот код в фоновом режиме и установить GIF для предварительного загрузчика изображений. Потому что, если в папке много файлов/подпапок, это может занять некоторое время, прежде чем разрешения будут изменены. И фоновый рабочий выполняет эту задачу в другом потоке, чтобы предотвратить зависание вашей формы. - person MrJack Mcfreder; 31.08.2018
comment
GetAccessControl(путь) не найден для Каталога. У кого-нибудь была такая же ошибка? - person anhtv13; 25.09.2019
comment
@anhtv13 anhtv13 убедитесь, что у вас есть using System.IO; в верхней части вашего файла, и ваш проект ориентирован на платформу .NET (а не на ядро ​​.NET). - person Yoshi; 26.09.2019
comment
Мой проект является ядром .Net, есть ли способ предоставить разрешение для основного проекта .Net? - person anhtv13; 26.09.2019
comment
@anhtv13, возможно, это поможет: stackoverflow.com/questions/40449973/ - person Yoshi; 26.09.2019

Приведенный ниже код проверяет наличие папки, если она не создана, создает ее. А затем устанавливает для каждого пользователя разрешение этой папки с полным разрешением (чтение и запись).

string file = @"D:\Richi";     
private static void GrantAccess(string file)
            {
                bool exists = System.IO.Directory.Exists(file);
                if (!exists)
                {
                    DirectoryInfo di = System.IO.Directory.CreateDirectory(file);
                    Console.WriteLine("The Folder is created Sucessfully");
                }
                else
                {
                    Console.WriteLine("The Folder already exists");
                }
                DirectoryInfo dInfo = new DirectoryInfo(file);
                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);

            }
person Richendra kumar ravi    schedule 02.08.2016
comment
Для тех, кто использует это, просто имейте в виду, что FileSystemRights.FullControl позволяет любому изменить разрешения и владельца этого файла. FileSystemRights.Modify нет и безопаснее. См. mdmarra.com/2013. /11/ для получения дополнительной информации. - person Yoshi; 01.02.2017

используйте FileSystemRights.FullControl вместо FileSystemRights.Modify, если вы хотите разрешить все действия (ACL).

person Simon Smeets    schedule 14.03.2011