ACL 的研究和实践
l 一个ACL 条目就是一个rule, 包含以下要素
类型
作用对象
权限
继承还是显式
传递对象
传递方式
允许 、拒绝
Guests、administrators
F、W、R
是继承的权限还是显式设置的权限
叶子、容器(文件夹)
是否传递给子对象
AccessControlType(allow,dency)
NTAccount(@"Gusts")
FileSystemRights
InheritanceFlags(Node, ContainerInherit, ObjectInherit)
PropagationFlags(None, NoPropagateInherit, nheritOnly)
作用于文件夹的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);
(right.fullcongrol 失效)
文件夹对应的权限生效!
当前目录没有设置任何权限!
但是文件夹内的文件被设置成了全部权限。
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl
继承得到完全的传递。
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl
(不常用)
当前文件夹不被设置成权限,目录下的子和孙子。。都被设成成权限。
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& FileSystemRights.FullControl (比较常用)
权限设置仅仅控制到当前树目录(当前文件夹和文件夹里面的叶子)
子文件夹不被设置。
(InheritanceFlags.ContainerInherit|InheritanceFlags.object) && PropagationFlags.None
(InheritanceFlags.ContainerInherit|InheritanceFlags.object)&& NoPropagateInherit