5

在我的应用程序中,我需要检查我是否有权写入文件夹。我使用以下方法:

public bool IsAvailable(string path)
        {
            bool hasPermissions = false;

            if (Directory.Exists(path))
            {
                var permission = new FileIOPermission(FileIOPermissionAccess.Write, path);
                try
                {
                    permission.Demand();
                    hasPermissions = true;
                }
                catch(SecurityException e)
                {
                    hasPermissions = false;
                }
            }

            return hasPermissions;
        }

当我给它一个我确定没有人可以访问它的文件夹的路径时(我已经在文件夹属性的安全选项卡中删除了所有用户的所有权限),它不会引发任何异常。它只是沿着 try 块继续。

任何想法为什么或如何更好地进行此检查?

我在其他问题上找到的 AppDomain.PermissionSet 属性相关答案没有成功。

先感谢您。

4

3 回答 3

4

我使用了以下方法来完成它:

public static bool HasWritePermissionOnDir(string path)
    {
        var writeAllow = false;
        var writeDeny = false;
        var accessControlList = Directory.GetAccessControl(path);
        if (accessControlList == null)
            return false;
        var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
        if (accessRules == null)
            return false;

        foreach (FileSystemAccessRule rule in accessRules)
        {
            if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) continue;

            if (rule.AccessControlType == AccessControlType.Allow)
                writeAllow = true;
            else if (rule.AccessControlType == AccessControlType.Deny)
                writeDeny = true;
        }

        return writeAllow && !writeDeny;
    }

请让我知道它是否对您有帮助,如果是,请标记它

于 2013-03-27T10:15:51.180 回答
2

这种方法(询问是否可访问,然后做某事)容易出现竞争条件。在您检查和实际访问该目录中的内容之间,权限可能会发生变化。

最好尝试在该目录中读/写某些内容,然后捕获潜在的异常。

所以不要

if(IsAvailable(path)) {
    try {
        doSomething();
    } catch (...) {
    }
}

反而

try {
    doSomething();
} catch (...) {
}

格蕾丝·霍珀名言:

“请求宽恕总是比获得许可更容易。”</p>

于 2013-03-27T10:04:07.100 回答
0
var permissionSet = new PermissionSet(PermissionState.None);    
var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename);
permissionSet.AddPermission(writePermission);

if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
{}
于 2013-03-27T10:04:26.020 回答