使用C#.NET将“所有人”特权添加到文件夹


74

我使用下面的代码允许所有人访问文件夹:

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

现在,将“所有人”用户添加到该文件夹​​中,但是没有分配任何权限。没有选中所有的读取,写入,执行等复选框。


您是否错过了SetAccessControl通话?msdn.microsoft.com/en-us/library/…–
Massif,

我做到了,但仍未选中正确的复选框。
Suresh Chaudhary

请注意,AccessControlSections.All通常需要管理员特权,否则您可能会收到以下消息异常:“该进程不具有此操作所需的'SeSecurityPrivilege'特权。由于您正在更改访问规则(而不是审核),因此请使用AccessControlSections.Access。
tachylatus

Answers:


133

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

我要做的第一件事是使用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安全对话框中的复选框与您已为测试目录设置的复选框匹配。


42
请注意,“所有人”将不适用于非英语版本的Windows。相反,您应该使用System.Security.Principal.WellKnownSidType.WorldSid
罗里

@Rory:谢谢您-因为它不适用于“每个人”(在德国Windows 2008 Server上)-但使用
WellKnownSidType

我建议在后台工作程序中运行此代码,并设置图片框预加载器gif。因为如果文件夹中有很多文件/子文件夹,更改权限可能需要一段时间。后台工作人员在另一个线程中运行该任务,以防止表单冻结。
MrJack Mcfreder '18

找不到目录的GetAccessControl(path)。有人遇到同样的错误吗?
anhtv13

@ anhtv13确保您using System.IO;位于文件顶部,并且您的项目针对的是.NET框架(而不是.NET核心)。
Yoshi

14

下面的代码检查文件夹是否存在(如果未创建),将创建一个。然后使用完全权限(读和写)设置该文件夹的每个用户权限。

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

            }

3
对于使用此FileSystemRights.FullControl功能的任何人,请注意,它允许任何人更改该文件的权限和所有权。 FileSystemRights.Modify不,而且更安全。详情请参阅mdmarra.com/2013/11/…
Yoshi

5

使用FileSystemRights.FullControl替代FileSystemRights.Modify,如果你想允许所有操作(ACL)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.