【问题标题】:FileSystemRights: List-only foldersFileSystemRights:仅列出文件夹
【发布时间】:2012-01-18 19:12:59
【问题描述】:

我有一个文件夹,它有一些严格的限制。对于一个用户,此人可以查看文件是否存在,但无法复制文件、打开文件等。他们唯一能做的就是查看文件是否存在。

当我查看顶层时,我看到列表文件夹内容被选中。这是他们被允许拥有的唯一权限。

现在,当使用 C# 提取权限时,我看到设置了几个项目,而不仅仅是一个。而当我深入查看权限时,我看到在这个较低的级别,检查了相应的项目。

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

如果我重新创建一个新文件夹并设置此处列出的权限,则用户可以将文件从新文件夹中复制出来,这是他们无法做到的。

我不了解 Windows 安全模型。

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

更新:

我包含用于提取信息的代码片段。也许这将有助于定义我在寻找什么。

    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;
    }

【问题讨论】:

    标签: c# file-permissions


    【解决方案1】:

    对于 LIST 访问,您必须确保权限仅适用于 “此文件夹和子文件夹”(请参阅您的屏幕截图)。

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

    完整列表(InheritanceFlags/PropagationFlags)见Damir Dobric的博客。

    开始编辑

    检查给定的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;
    }
    

    结束编辑

    希望,这会有所帮助。

    【讨论】:

    • 我不想改变值。我正在尝试获取 ACE 中已经存在的值。我不明白你的说法如何适用于这种情况。
    • @Jerry:我已经更新了我的答案。您可以使用 PropagationFlags 和 InheritanceFlags 来检查“仅列出文件夹内容”权限。
    • 老实说,这对我来说毫无意义,但它确实返回了正确的值。当我使用相同的模式来检查 READ 和 WRITE 时,它确实会返回适当的真/假值。谢谢!!
    • 如果文件夹是共享的并且有读取权限,这将如何表现?
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2013-03-22
    • 2023-04-03
    相关资源
    最近更新 更多