2011-12-12 35 views
2

我有一个文件夹,它有一些严格的限制。对于一个用户,这个人可以看到文件是否存在,但不能复制文件,打开文件等等。他们能做的唯一的事情就是看文件是否存在。FileSystemRights:仅列表文件夹

当我看顶层,我看到列出文件夹内容进行检查。这是他们被允许拥有的唯一权限。现在

enter image description here

,当使用C#拉权利,我看到几个项目设置,不只是一个。当我更深入地看待权利时,我发现在这个较低的层次上,相应的项目被检查。

enter image description here

当我得到的权利,这个文件夹,它显示因为读了低级别的标志设置该文件夹具有“读”访问。但是,我已经用此用户的帐户进行了测试。他们肯定没有阅读权限。

如果我重新创建一个新的文件夹,并设置为这里列出的权限,然后用户可以将文件复制出来的新文件夹,他们不应该是能够做到的。

我不理解Windows安全模式。

我如何验证用户具有列表访问,但不读访问?我会特别查询什么?注意:查询“列出文件夹/读取数据”而不是“读取权限”不起作用,如下所示。这两者显然都是由更高级别的“列出文件夹内容”选项设置的。

UPDATE:

我包括代码剪断我用拉的信息。也许这将有助于确定我在找什么。

internal void GroupsFromPath(string pth, bool IncludeInherited) 
    { 
     DirectorySecurity ds; 
     try 
     { 
      DirectoryInfo di = new DirectoryInfo(pth); 
      ds = di.GetAccessControl(AccessControlSections.Access); 
     } 
     catch 
     { 
      return ret; 
     } 

     AuthorizationRuleCollection acl = ds.GetAccessRules(true, 
       IncludeInherited, typeof(NTAccount)); 

     foreach (FileSystemAccessRule ace in acl) 
     { 
      bool L = CheckRights(ace, FileSystemRights.Traverse | 
       FileSystemRights.ListDirectory); 

      bool R = CheckRights(ace, FileSystemRights.Read); 
      bool W = CheckRights(ace, FileSystemRights.Modify); 

      DO_MAGIC(pth, L, R, W); 
     } 
    } 

    private bool CheckRights(FileSystemAccessRule ACE, 
      FileSystemRights fileSystemRights) 
    { 
     bool r = ((ACE.FileSystemRights & fileSystemRights) == fileSystemRights) 
      && (ACE.AccessControlType == AccessControlType.Allow); 

     return r; 
    } 

回答

3

对于你必须确保该权限只适用于“此文件夹和子文件夹”(看你的截图)列表访问。

FileSystemAccessRuleInheritanceFlags属性必须设置为InheritanceFlags.ContainerInheritPropagationFlags属性必须设置为PropagationFlags.None

有关完整列表(InheritanceFlags/PropagationFlags)看到的Damir Dobric的博客。

BEGIN编辑

检查给定FileSystemAccessRule是否实现“列出文件夹内容只有”权限 你可以用下面的方法(使用InheritanceFlagsPropagationFlags属性):

private static bool CheckListFolderContentOnly(FileSystemAccessRule ace) 
{ 
    if (ace.PropagationFlags == PropagationFlags.None && 
     ace.InheritanceFlags == InheritanceFlags.ContainerInherit && 
     ace.FileSystemRights == (FileSystemRights.ReadAndExecute | FileSystemRights.Synchronize)) 
    { 
    return true; 
    } 

    return false; 
} 

END编辑

希望,这有助于。

+0

我不想改变价值。我正在尝试获取已经在ACE中的值。我不明白你的陈述如何适用于这种情况。 – Jerry

+0

@Jerry:我已经更新了我的答案。您可以使用PropagationFlags和InheritanceFlags检查“仅列出文件夹内容”权限。 – Hans

+0

说实话,这对我来说没有任何意义,但它确实会返回正确的价值。当我使用相同的模式来检查READ和WRITE时,它会返回相应的真/假值。谢谢!! – Jerry