我有winforms app,我需要访问安全目录。 我正在使用模拟并创建WindowsIdentity来访问该文件夹。
我的问题是编写单元测试来测试目录安全性;我想写一个代码,创建一个只保护一个用户的目录,这不是当前运行UT的用户(否则测试将毫无价值)。
我知道如何为某个用户添加权限,但我怎么能否认其余的,包括管理员? (如果运行UT的用户是管理员)(这是明智的做法吗?)
DirectoryInfo directoryInfo = new DirectoryInfo(path);
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
directorySecurity.AddAccessRule(new FileSystemAccessRule("Domain\SecuredUser",
FileSystemRights.FullControl,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.InheritOnly,
AccessControlType.Allow));
directorySecurity.RemoveAccessRule(new FileSystemAccessRule("??",
FileSystemRights.FullControl,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.InheritOnly,
AccessControlType.Deny));
directoryInfo.SetAccessControl(directorySecurity);
这不起作用。我不知道我应该否认谁。 Domain \ Admins,Domain \ Administrators,me ...没有人被拒绝,当我检查文件夹的安全性时 - SecuredUser可以访问该文件夹,但是即使我指定了FullControl,也不会检查权限。
基本上我想编写代码:
<authorization>
<allow users ="Domain\User" />
<deny users="*" />
</authorization>
我在考虑使用没有权限的弱用户模拟UT运行,但这会导致:Impersonate - &gt;运行UT - &gt;模仿 - &gt;访问文件夹,我不确定这是否是正确的设计。
非常感谢帮助,谢谢。
答案 0 :(得分:2)
我不确定这一点,但我认为deny优先于allow。因此,如果您尝试拒绝所有人的权限(使用“Everyone”组),它可能会覆盖您尝试授予访问权限的特殊用户的权限。
应该做的是删除所有现有的访问权限,然后添加允许特殊用户访问的单个规则。
答案 1 :(得分:1)
我刚刚测试了来自http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.setaccesscontrol%28v=VS.100%29.aspx的msdn示例代码,我遇到了同样的问题。当我逐步调试示例程序时,添加的访问权限只是“特殊权限”而不是程序中指定的“readdata”。
更新:在Windows 7中,在文件 - &gt;下;属性 - &gt;安全 - &gt;高级 - &gt;有效权限,权限显示为广告。 “特殊权限”的勾选实际上是误导性的
Update2:如果使用五参数构造函数并将标志设置为“InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit”和“PropagationFlags.InheritOnly”,则访问权限将在安全选项卡中显示,与添加的完全相同。只有在每个子目录下继承和传播权限时,才会勾选安全选项卡中的长访问列表。
答案 2 :(得分:0)
您是否考虑过帐户组“{domainName} \ Domain Users”?拒绝访问此组应拒绝访问指定域中的所有用户。