使用C#.NET将“Everyone”权限添加到文件夹

我已经使用下面的代码来允许每个人访问一个文件夹:

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用户被添加到文件夹,但没有分配任何权限。 所有读取,写入,执行等checkbox不被检查。

我想告诉你的第一件事是我如何find这个解决scheme。 这可能比答案更重要,因为文件许可很难得到正确的。

我做的第一件事是使用Windows对话框和checkbox设置我想要的权限。 我添加了“每个人”的规则,并勾选除“完全控制”之外的所有框。

然后我编写了这个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 

所以这个解决scheme很简单(如果你不知道该找什么,这个解决scheme很难做到)。

 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安全对话框中的checkbox与已经为您的testing目录设置的内容相匹配。

下面的代码检查文件夹的存在,如果没有创build,则创build一个。 然后设置完全权限(读写)该文件夹的每个用户权限。

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

如果要允许所有操作(ACL),请使用FileSystemRights.FullControl而不是FileSystemRights.Modify

Interesting Posts