Добавьте привилегию «Все» в папку, используя C # .NET - PullRequest
68 голосов
/ 14 марта 2011

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

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);

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

Ответы [ 3 ]

118 голосов
/ 23 марта 2011

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

Первое, что я сделал, это установил нужные мне разрешения, используя диалоговые окна и флажки 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 в соответствии с тем, что вы уже установили для своего тестового каталога.

11 голосов
/ 02 августа 2016

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

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);

            }
5 голосов
/ 14 марта 2011

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

...