代码之家  ›  专栏  ›  技术社区  ›  JustABill

如何检查Windows文件是否可读/可写?

  •  4
  • JustABill  · 技术社区  · 14 年前

    首先:我知道这对于实际检查我是否能写是不可靠的。我正在编写一个文件传输客户机,想要“远程”和“本地”文件浏览器窗格之间的功能对等。我完全理解,无论执行什么操作,我都必须处理任何与权限相关的异常;这不是编程检查,它只是向用户显示而已。

    我看到了一些关于这些帖子的例子,但是我所做的尝试要么是不理解,要么是不起作用。我尝试了以下两种方法,但对于我绝对无法写入的内容(例如,c:\windows或c:\program files的内容),这两种方法都返回了“yes”(是):

    System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, Path);
    return System.Security.SecurityManager.IsGranted(fp);
    

    System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, element.Path);
    try
    {
        fp.Assert();
        return true;
    }
    catch(Exception x)
    {
        return false;
    }
    

    (再说一遍,我知道 Exception 太可怕了,用Try/Catch来表示逻辑就不那么可怕了,我只是想让它发挥作用)。

    第一个告诉我 IsGranted 已弃用,我应该使用 AppDomain.PermissionSet Application.PermissionSet 但是我找不到任何关于如何使用这些有意义的解释。我也看到了我应该手动枚举所有的ACL来自己解决这个问题,但同样没有真正的例子。设置权限的例子很多,但检查权限的例子很少。

    任何帮助都将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  2
  •   JustABill    14 年前

    好吧,这就是我最终得出的结论:

        private readonly static WindowsIdentity _identity = WindowsIdentity.GetCurrent();
        protected static bool GetPermission(FileSystemRights right, string path)
        {
            FileSecurity fs;
            try
            {
                fs = System.IO.File.GetAccessControl(path);
            }
            catch(InvalidOperationException)
            {
                // called on a disk that's not present, ...
                return false;
            }
            catch(UnauthorizedAccessException)
            {
                return false;
            }
            foreach(FileSystemAccessRule fsar in fs.GetAccessRules(true, true, typeof(SecurityIdentifier)))
            {
                if(fsar.IdentityReference == _identity.User && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow)
                {
                    return true;
                }
                else if(_identity.Groups.Contains(fsar.IdentityReference) && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow)
                {
                    return true;
                }
            }
            return false;
        }
    

    当然,这是不理想的,因为它忽略了否认权利。但我不知道要用哪种顺序来应用各种ace(我想是吗?)为了找出“正确”的能力。尽管如此,拒绝规则还是比较少见的,所以大部分时间对我来说都是有效的。