首页 > 解决方案 > 从 System.IO.Abstractions 抛出 UnauthorizedAccessException

问题描述

我正在使用System.IO.Abstractionshttps://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");

标签: c#testingfilesystems

解决方案


我尝试了这样的事情并失败了:

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());

推荐阅读