Добавьте привилегию "Все" в папку, используя 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);
Теперь пользователь "Все" добавляется в папку, но не с назначенными правами. Все флажки чтения, записи, выполнения и т. Д. Не отмечены.
3 ответа
First thing I want to tell you is how I found this solution. This is probably more important than the answer because file permissions are hard to get correct.
Первым делом я установил нужные мне разрешения с помощью диалогов и флажков 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 в соответствии с тем, что вы уже установили для своего тестового каталога.
Приведенный ниже код проверяет существование папки, если она не создана, создает ее. И затем устанавливает каждое пользовательское разрешение для этой папки с полным разрешением (чтение и запись).
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);
}
Использование FileSystemRights.FullControl
вместо FileSystemRights.Modify
если вы хотите разрешить все действия (ACL).