如何为特定目录的管理员分配目录权限?

时间:2018-05-15 06:21:05

标签: c# .net windows permissions .net-4.5

我正在尝试仅向管理员分配权限,并拒绝其他非管理员用户的访问权限。以下是代码 -

DirectoryInfo di = new DirectoryInfo(@"C:\C00");

DirectorySecurity dirSec = di.GetAccessControl();
dirSec.SetAccessRuleProtection(true, false);

SecurityIdentifier systemSid = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null);
NTAccount systemAccount = (NTAccount)systemSid.Translate(typeof(NTAccount));

SecurityIdentifier adminSid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
NTAccount adminAccount = (NTAccount)adminSid.Translate(typeof(NTAccount));

SecurityIdentifier userSid = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
NTAccount userAccount = (NTAccount)userSid.Translate(typeof(NTAccount));

//access rule 1
dirSec.AddAccessRule(new FileSystemAccessRule(systemAccount, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
//access rule 2
dirSec.AddAccessRule(new FileSystemAccessRule(adminAccount, FileSystemRights.Read, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
//access rule 3
dirSec.AddAccessRule(new FileSystemAccessRule(userAccount, FileSystemRights.Read, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Deny));
            di.SetAccessControl(dirSec);
return;

使用上面的代码,即使管理员也无法访问该文件夹,但没有注释中表示的访问规则"访问规则3"它按预期工作。任何人都可以告诉我为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

请参阅下图以更好地了解DACL的工作原理

DACL can allow access to one thread while denying access to another

当明确授予或拒绝请求的访问权限时,Windows将停止检查访问控制条目。 ACE的顺序非常重要。请注意,如果示例中的ACE顺序不同,则系统可能已授予对线程A的访问权限。

关于拒绝ACE的一些注意事项

  

在大多数情况下,您可以使用控制对对象的访问   允许访问的ACE;您不需要明确拒绝访问   宾语。例外情况是ACE允许访问组和您   想要拒绝访问该组的成员。为此,请放置一个   在允许访问之前,DACL中用户的访问被拒绝ACE   ACE为该组织。请注意,ACE的顺序很重要   因为系统会按顺序读取ACE,直到授予访问权限   或否认。用户的访问被拒绝ACE必须首先出现;除此以外,   当系统读取组的访问允许ACE时,它将授予   访问受限用户。

How AccessCheck Works

How the System Uses ACLs