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

时间:2010-06-05 00:42:11

标签: c# .net permissions acl file-permissions

首先:我知道这对于实际检查我是否可以写是不可靠的。我正在编写文件传输客户端,并希望在“远程”和“本地”文件浏览器窗格之间进行功能奇偶校验。我完全明白,无论如何,我都必须为任何执行的操作处理任何与权限相关的异常;它不是一个编程检查它只是显示给用户。

我已经看到了这些发布的几个例子,但是我尝试过的所有内容都是不可理解的或者不起作用。我已经尝试了以下两种方法,但两者都只是为了我无法写入的内容返回“是”(例如C:\ Windows或C:\ Program Files的内容):

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.PermissionSetApplication.PermissionSet,但我找不到任何有用的解释。我还看到我应该手动枚举所有的ACL来自己弄清楚,但是再次没有真正的例子。设置权限有很多例子,但很少有人检查它们。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

嗯,这就是我最终结束的事情:

    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(我认为?)以找出“正确”的能力。尽管如此,拒绝规则相对较少,因此它对我来说大部分时间都有效。