c# - 从 System.IO.Abstractions 抛出 UnauthorizedAccessException
问题描述
我正在使用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");
解决方案
我尝试了这样的事情并失败了:
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());
推荐阅读
- javascript - 使用不同的企业 ID 时,信任试点轮播不起作用
- php - redis大通道数性能
- php - 使用 PHP 将 JSON 中的“false”值转换为空字符串
- php - Joomla 插件将 Javascript 片段注入所有页面
- android - 在 Outterclass 中应用更改的 Runnable 匿名类模拟示例?
- ios - 无法在桥文件中导入“fscalendar.h”
- html - 如何使手风琴面板可点击,而不仅仅是文本
- objective-c - 读取对象上未找到的字典元素的预期方法
- r - 用相同位数的随机数替换数字
- hive - Hive 表是 MANAGED 或 EXTERNAL - 发布表类型转换