首先:我知道这对于实际检查我是否可以写是不可靠的。我正在编写文件传输客户端,并希望在“远程”和“本地”文件浏览器窗格之间进行功能奇偶校验。我完全明白,无论如何,我都必须为任何执行的操作处理任何与权限相关的异常;它不是一个编程检查它只是显示给用户。
我已经看到了这些发布的几个例子,但是我尝试过的所有内容都是不可理解的或者不起作用。我已经尝试了以下两种方法,但两者都只是为了我无法写入的内容返回“是”(例如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.PermissionSet
或Application.PermissionSet
,但我找不到任何有用的解释。我还看到我应该手动枚举所有的ACL来自己弄清楚,但是再次没有真正的例子。设置权限有很多例子,但很少有人检查它们。
非常感谢任何帮助。
答案 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(我认为?)以找出“正确”的能力。尽管如此,拒绝规则相对较少,因此它对我来说大部分时间都有效。