Выдать исключение UnauthorizedAccessException из System.IO.Abstractions - PullRequest
0 голосов
/ 25 марта 2019

Я использую System.IO.Abstractions (https://github.com/System-IO-Abstractions), чтобы позволить мне вводить IFileSystem в мой класс. Недавно я добавил кусок кода, чтобы поймать бросок UnauthorizedAccessException, когда пользователь пытаетсясоздать файл в каталоге, к которому у них нет прав на запись.

Есть ли способ установить права доступа к каталогу в System.IO.Abstractions?

Следующий коднасколько возможно близко (MockFileSystem от System.IO.Abstractions). AccessControlSections описание

Указывает, какие разделы дескриптора безопасности сохранять или загружать

Похоже, мне нужно установить какой-то дескриптор безопасности, но я не могу найти какую-либо информацию об этом - или, если это даже правильный подход.

var mockFileSystem = new MockFileSystem();
mockFileSystem.Directory.CreateDirectory("C:\\Test", new DirectorySecurity("C:\\Test", AccessControlSections.None));

// This should throw an UnauthorizedAccessException
mockFileSystem.File.Create("C:\\Test\\File.txt");

1 Ответ

1 голос
/ 09 мая 2019

Я попробовал что-то подобное и потерпел неудачу:

const string path = @"C:\temp\incoming";
var fileSystem = new MockFileSystem();
fileSystem.AddDirectory(path);
var diFactory = fileSystem.DirectoryInfo;
var directoryInfo = diFactory.FromDirectoryName(path);
var directorySecurity = directoryInfo.GetAccessControl();
var currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
directorySecurity.AddAccessRule(new FileSystemAccessRule(currentUser , FileSystemRights.Read, AccessControlType.Allow));

Я все еще думаю, что это более или менее правильный путь, к сожалению, он не работает: - (

Может быть,Пользователь, которого я указываю для AccessRule, не верный, я пробовал и с другими, но безрезультатно:

var adminUser = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
// -> Doesn't work either..

В любом случае, в конце концов, я создал этот грязный обходной путь для его тестирования, и этоработает очевидно:

var mockFileSystem = new Mock<IFileSystem>();
mockFileSystem.Setup(x => x.File.Create(It.IsAny<string>())).Throws(new Exception());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...