Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件系统权限:仅列出文件夹_C#_File Permissions - Fatal编程技术网

C# 文件系统权限:仅列出文件夹

C# 文件系统权限:仅列出文件夹,c#,file-permissions,C#,File Permissions,我有一个文件夹,有很多限制。对于一个用户,此人可以查看文件是否存在,但不能复制文件、打开文件等。他们唯一能做的就是查看文件是否存在 当我查看顶层时,我看到列表文件夹内容被选中。这是他们唯一被允许的权限 现在,当使用C#拖动权限时,我看到设置了几个项,而不是一个。当我深入查看权限时,我看到在这个较低的级别上,相应的项目被检查 当我获得此文件夹的权限时,它显示该文件夹具有“读取”访问权限,因为已设置读取的低级标志。但是,我已经用这个用户的帐户进行了测试。它们肯定没有读取权限 如果我重新创建一个新

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

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

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

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

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

我不了解Windows安全模型

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

更新:

我包括了我用来提取信息的代码剪报。也许这将有助于确定我在寻找什么

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

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

FileSystemAccessRule
InheritanceFlags
属性必须设置为
InheritanceFlags.ContainerInherit
,而
PropagationFlags
属性必须设置为
PropagationFlags.None

有关完整列表(InheritanceFlags/PropagationFlags),请参阅的博客

开始编辑

要检查给定的
文件系统访问规则
是否实现了“仅列出文件夹内容”权限 您可以使用以下方法(使用
InheritanceFlags
PropagationFlags
属性):

结束编辑


希望,这会有所帮助。

我不想更改值。我正在尝试获取ACE中已经存在的值。我不明白你的说法在这种情况下如何适用。@Jerry:我已经更新了我的答案。您可以使用PropagationFlags和InheritanceFlags检查“仅列出文件夹内容”权限。老实说,这对我来说毫无意义,但它确实返回了正确的值。当我使用相同的模式来检查读写时,它会返回适当的真/假值。非常感谢。如果文件夹是共享的,并且有读取权限,这将如何操作?
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;
}