ACL 的研究和实践
1 Acl 的基本构成
l 一个ACL 条目就是一个rule, 包含以下要素
类型 | 作用对象 | 权限 | 继承还是显式 | 传递对象 | 传递方式 |
允许 、拒绝 | Guests、administrators | F、W、R | 是继承的权限还是显式设置的权限 | 叶子、容器(文件夹) | 是否传递给子对象 |
AccessControlType(allow,dency) | NTAccount(@"Gusts") | FileSystemRights |
| InheritanceFlags(Node, ContainerInherit, ObjectInherit) | PropagationFlags(None, NoPropagateInherit, nheritOnly) |
2 ALC 语义测试文件夹
2.1 InheritanceFlags 的作用
作用于文件夹的ACL 实际是对文件夹内的 容器(文件夹)和叶子(文件) 的权限限制当前文件夹的删除是它上一级文件夹的权限控制,针对文件夹的FileSystemRights 的权限一部分是针对内部容器的权限一部分是针对内部叶子的权限。如果InheritanceFlags. ContainerInherit 则叶子的权限就算选择也不会被设置,如果ObjectInherit 则 文件夹属于的权限不被设置。
关于 InheritanceFlags 通常应该设置成:InheritanceFlags. ContainerInherit| InheritanceFlags. object
string filename = "d://xw"; FileSystemAccessRule rule = new FileSystemAccessRule("Guests", FileSystemRights.FullControl, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow); DirectorySecurity sec= System.IO.Directory .GetAccessControl(filename); sec.AddAccessRule(rule); System.IO.Directory.SetAccessControl(filename, sec); |
2.1.1InheritanceFlags.None && PropagationFlags.None
(right.fullcongrol 失效)
2.1.2InheritanceFlags.ContainerInherit && FileSystemRights.FullControl&& PropagationFlags.None
文件夹对应的权限生效!
2.1.3InheritanceFlags.Object && FileSystemRights.FullControl&& PropagationFlags.None
当前目录没有设置任何权限!
但是文件夹内的文件被设置成了全部权限。
2.1.4(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl&& PropagationFlags.None
2.2 关于 PropagationFlags
2.2.1 PropagationFlags.None
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl
继承得到完全的传递。
2.2.2 PropagationFlags. InheritOnly
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl
(不常用)
当前文件夹不被设置成权限,目录下的子和孙子。。都被设成成权限。
2.2.3 PropagationFlags. NoPropagateInherit
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl (比较常用)
权限设置仅仅控制到当前树目录(当前文件夹和文件夹里面的叶子)
子文件夹不被设置。
2.3 常用的继承和传递组合
2.3.1 作用于所有文件和文件夹包含子和孙子
(InheritanceFlags.ContainerInherit|InheritanceFlags.object) && PropagationFlags.None
2.3.2 作用于当前文件夹和文件夹里面的叶子(文件)
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& NoPropagateInherit