C# - Windows ACL - 应用继承的权限

时间:2009-09-11 15:47:32

标签: c# windows permissions acl

我一直遇到以编程方式为文件夹/注册表项分配权限的问题。我已设法使用以下代码分配继承权限:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow);

DirectorySecurity security = new DirectorySecurity(); 
security.SetAccessRule(rule);

Directory.CreateDirectory(dir);
Directory.SetAccessControl(dir, security);

这正确地设置了我作为管理员创建的所有子文件夹的文件权限。但是,它不会在dir文件夹本身上设置权限。我已经为继承和传播做了相当多的排列,但没有任何快乐。

例如,我有:

dir = %programfiles%\Test

如果我在测试中创建了一个文件夹(%programfiles%\Test\SubFolder),我为我的用户分配了完整的权限,但我对%programfiles%\Test没有完全权限。这真的很烦人,因为我想让我的用户完全有权使用Test目录做任何事情。

我在注册表权限方面遇到了类似的问题,但我相信如果我能解决这个问题,我可以解决这两个悬而未决的问题。

有谁知道如何解决这个问题?

问候

2 个答案:

答案 0 :(得分:14)

对于文件夹:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME, 
    FileSystemRights.FullControl, AccessControlType.Allow);

对于子文件夹和文件:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME,
    FileSystemRights.FullControl, InheritanceFlags.ContainerInherit |  
    InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, 
    AccessControlType.Allow);

这两行都需要在您的项目中。然后你得到适用于这个文件夹,子文件夹和文件的acls

答案 1 :(得分:9)

我不是这里的专家,但在为了我自己的目的而不得不想出这个问题之后,我相信Dave的答案虽然功能齐全,却过于复杂。你应该只用一条规则来实现这个目标:

FileSystemAccessRule rule = new FileSystemAccessRule(LOGON_USER_NAME,
    FileSystemRights.FullControl,
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
    PropagationFlags.None, 
    AccessControlType.Allow);

OP在其原始代码中使用的PropagationFlags.InheritOnly参数是阻止访问规则应用于对象本身的原因。

此外,您可以在创建目录时设置安全性,因为.NET为此提供了重载:

Directory.CreateDirectory(dir, security);