我最近遇到了从网络加载文件的问题,并希望能够在测试中重新创建错误并遇到了同样的问题。
我想出了以下小类来帮助解决它,因为做这些事情的 API 非常可怕并且充满了小陷阱:
public class PermissionController
{
private readonly string _file;
private readonly FileSecurity _accessControl;
private readonly SecurityIdentifier _id;
private readonly List<FileSystemAccessRule> _permissionsDenied;
public PermissionController(string file)
{
_file = file;
_accessControl = File.GetAccessControl(_file);
_id = WindowsIdentity.GetCurrent().Owner;
_permissionsDenied = new List<FileSystemAccessRule>();
}
public void Allow(params FileSystemRights[] rights)
{
foreach (var right in rights)
AddRule(Rule(right, AccessControlType.Allow));
}
public void Deny(params FileSystemRights[] rights)
{
foreach (var right in rights)
{
var rule = Rule(right, AccessControlType.Deny);
AddRule(rule);
_permissionsDenied.Add(rule);
}
}
private void AddRule(FileSystemAccessRule rule)
{
_accessControl.AddAccessRule(rule);
}
private FileSystemAccessRule Rule(FileSystemRights right, AccessControlType type)
{
return new FileSystemAccessRule(_id, right, type);
}
public void RemoveDeniedPermissions()
{
foreach (var rule in _permissionsDenied)
_accessControl.RemoveAccessRule(rule);
Apply();
}
public void Apply()
{
File.SetAccessControl(_file,_accessControl);
}
}
调用代码如下所示:
_permissionController = new PermissionController(_file);
_permissionController.Allow(FileSystemRights.Read, FileSystemRights.Write);
_permissionController.Deny(FileSystemRights.FullControl,
FileSystemRights.Modify,
FileSystemRights.ReadAndExecute);
_permissionController.Apply();
其中 _file 是完全限定的路径。
你需要小心打电话
File.SetAccessControl 添加/删除规则后,否则没有效果。
除非我误解了 API,否则您必须为每个权限添加一条规则,因为 FileSystemRights 枚举不使用标志。
您还需要小心一点,因为允许您拒绝的权利并不等同于删除拒绝该权利的规则。似乎被拒绝的权利覆盖了被允许的权利。
您可以通过在 Windows 资源管理器中查看文件属性的安全选项卡来观察结果。