从System.IO.Abstractions抛出UnauthorizedAccessException

时间:2019-03-25 09:27:00

标签: c# testing filesystems

我正在使用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");

1 个答案:

答案 0 :(得分:1)

我尝试过类似的操作,但失败了:

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