在我的应用程序中,我需要检查是否有权写入文件夹。我使用以下方法:
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属性相关答案没有成功。
提前谢谢。
答案 0 :(得分:3)
我使用了以下方法来完成它:
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;
}
请告诉我它是否对您有所帮助,如果是的话也要标记
答案 1 :(得分:2)
这种方法(询问是否可访问,然后做某事)容易出现竞争条件。在您的检查和对该目录中内容的实际访问之间,权限可能会发生变化。
最好只是尝试在该目录中读取/写入内容,并捕获潜在的异常。
所以不要
if(IsAvailable(path)) {
try {
doSomething();
} catch (...) {
}
}
而是
try {
doSomething();
} catch (...) {
}
Grace Hopper引用:
“请求宽恕总是比获得许可更容易。”
答案 2 :(得分:0)
var permissionSet = new PermissionSet(PermissionState.None);
var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename);
permissionSet.AddPermission(writePermission);
if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
{}