使用DokanNet 2.1.0挂载驱动器时遇System.UnauthorizedAccessException权限问题
解决DokanNet 2.1.0 + .NET 8虚拟文件系统创建文件/文件夹权限拒绝问题
以下是针对你遇到的System.UnauthorizedAccessException问题的具体解决步骤:
检查挂载配置的权限选项
Dokan的挂载权限完全由DokanOptions控制,默认配置可能是只读模式。必须显式添加写入、创建相关的权限标志:var mountOptions = new DokanOptions { MountPoint = "Z:", // 选一个未被占用的驱动器号 Options = DokanOptions.Write | DokanOptions.Delete | DokanOptions.CreateFiles | DokanOptions.CreateDirectories | DokanOptions.MountManager, // 让系统正确识别虚拟挂载点 ThreadCount = 4, Version = DokanVersion.Version18 // 匹配DokanNet 2.1.0对应的驱动版本 };完整实现IDokanOperations回调方法
虚拟文件系统的所有操作(创建、读写、删除)都依赖你实现的IDokanOperations接口方法,遗漏或错误实现会导致权限拒绝:- 必须正确实现
CreateDirectory和CreateFile方法,返回DokanError.Success:public DokanError CreateDirectory(string dirPath, FileAccess access, IDokanFileInfo info) { // 在这里添加你的目录创建逻辑(比如内存字典、数据库存储) info.IsDirectory = true; return DokanError.Success; } public DokanError CreateFile(string filePath, FileAccess access, FileShare share, FileMode mode, FileOptions options, FileAttributes attributes, IDokanFileInfo info) { // 在这里添加你的文件创建逻辑 info.Context = new YourFileContext(); // 关联自定义文件上下文 return DokanError.Success; } - 禁用不必要的用户模拟:如果你的后端存储不需要模拟当前用户,设置
info.Impersonate = false,避免权限模拟冲突。 - 确保
GetFileInformation、SetFileAttributes方法正确返回文件/目录的元数据,否则系统会判定权限不足。
- 必须正确实现
修复Dokan内核驱动权限
Dokan依赖内核级驱动,即使管理员运行VS,驱动未正确安装也会导致权限问题:- 下载与DokanNet 2.1.0匹配的Dokan驱动安装包(版本2.1.0)。
- 右键以管理员身份运行安装程序,选择「Repair」修复驱动安装。
- 重启电脑后重新测试挂载。
测试时跳过系统权限检查(仅用于排查)
临时添加DokanOptions.NoSecurity标志,跳过Windows ACL权限验证,排查是否是权限回调逻辑的问题:Options = DokanOptions.Write | DokanOptions.NoSecurity | DokanOptions.CreateDirectories | ...如果此时能正常创建文件/文件夹,说明你需要重新实现
GetFileSecurity和SetFileSecurity方法,正确处理虚拟文件系统的权限控制。确认挂载驱动器号未被占用
使用diskpart命令检查驱动器号占用情况:diskpart list volume选择一个未被物理驱动器或其他虚拟盘占用的驱动器号(如Z:)重新挂载。
内容的提问来源于stack exchange,提问作者Chizaram Obiakor
相关产品推荐
相关产品推荐

