Недавно я столкнулся с проблемой загрузки файлов из сети и хотел иметь возможность воссоздать ошибку в тесте и столкнулся с той же проблемой.
Я придумал следующий небольшой класс, чтобы помочь с этим, так как 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.