【问题标题】:How to check accessibility of a folder? [duplicate]如何检查文件夹的可访问性? [复制]
【发布时间】:2014-11-03 04:48:57
【问题描述】:

我有一个共享文件夹。如何在 C# 中检查当前用户是否有权访问该文件夹?

我已经尝试过SecurityManager.IsGranted,但不知何故它对我没有任何好处。可能是因为它是针对文件的,而不是针对文件夹的。

【问题讨论】:

  • 将您的问题标题复制/粘贴到 Google 搜索框中,抢占先机。
  • 通过“访问”,您具体指的是哪些权限?有枚举内容访问、读取数据访问、创建文件访问、写入数据访问……等等。您应该查看FileSystemRights 枚举以找出您想要检查的内容。对于只是读/写,我建议只是尝试它并捕获任何异常。
  • @HansPassant 我刚做的时候遇到了这个问题:)

标签: c# .net directory


【解决方案1】:

如果你没有权限,使用Directory.Exists它会返回false

参见备注部分 MSDN

也正如@jbriggs 的回答中所建议的,如果您无权访问,您应该获得UnautorizedAccessException

【讨论】:

    【解决方案2】:

    如果我没记错的话,您必须尝试向文件夹中写入一些内容或从文件夹中读取一些内容并捕获异常。

    编辑:您可以执行以下操作,但我不确定它是否适用于所有情况(例如允许或拒绝用户组的权限)

    public bool HasAccess(string path, string user)
    {
    System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.WorldSid, null);
    System.Security.Principal.NTAccount acct = sid.Translate(typeof(System.Security.Principal.NTAccount)) as System.Security.Principal.NTAccount;
    bool userHasAccess = false;
    if( Directory.Exists(path))
    {
      DirectorySecurity sec = Directory.GetAccessControl(path);
      AuthorizationRuleCollection rules = sec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
      foreach (AccessRule rule in rules)
      {
        // check is the Everyone account is denied
        if (rule.IdentityReference.Value == acct.ToString() && 
            rule.AccessControlType == AccessControlType.Deny)
        {
          userHasAccess = false;
          break;
        }
        if (rule.IdentityReference.Value == user)
        {
          if (rule.AccessControlType != AccessControlType.Deny)                 
            userHasAccess = true;
          else
            userHasAccess = false;
          break;
        }
      }
    }
    return userHasAccess;
    }            
    

    【讨论】:

    • try catch 用作条件语句是不好的做法。
    • @DLeh 你知道其他方法吗?如果没有更好的方法,这不是坏习惯。在我看来,使用 Directory.Exist 不是一个有效的解决方案。如果用户检查 Directory.Exist 它由于权限返回 false 怎么办,所以目录确实存在,然后用户执行 Directory.CreateDirectory 并且无论如何都会引发异常。
    • 问题被标记为重复。不管怎样,看看其他答案。是的,如果您要创建目录并捕获,则可能需要注意这一点,但 OP 只是要求检查目录的访问权限。
    • 这个被标记为重复的问题的答案是错误的。尝试创建一个目录并拒绝其他用户的访问。另一个答案的 CanRead 函数将返回 false。
    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多