c# - 文件系统权限 : List-only folders

标签 c# file-permissions

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

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

enter image description here

现在,当使用 C# 拉取权限时,我看到设置了多个项目,而不仅仅是一个。当我更深入地研究权利时,我发现在这个较低的级别,相应的项目被检查。

enter image description here

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

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

我不了解 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;
    }

最佳答案

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

FileSystemAccessRuleInheritanceFlags 属性必须设置为 InheritanceFlags.ContainerInherit,并且 PropagationFlags 属性必须设置为设置为 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;
}

结束编辑

希望这会有所帮助。

关于c# - 文件系统权限 : List-only folders,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8480308/

相关文章:

c# - Lua 语言上下文/作用域实现

c# - 如何将分层数据数据绑定(bind)到 WPF TreeView?

C# GUI 在 C 硬计算引擎之上

apache - Docker 内部 Apache 的权限问题

asp.net - Tortoise SVN 操作后文件丢失 IIS_IUSRS 权限

ubuntu - 具有组写访问权限的用户的 SFTP 覆盖失败

c# - 字符串内计数的整洁解决方案

c# - 搜索引擎太慢

c# - XNA - 保存 xml 文件时出现 UnauthorizedAccessException

linux - Unix 文件权限取决于路径(?)