Windows 10下非管理员调用CreateFile访问物理磁盘的权限问题
非管理员权限下访问物理磁盘的解决方案
Windows 10 1709及后续版本对物理磁盘(如\\.\PHYSICALDRIVE0)的访问做了严格权限管控,普通用户进程的令牌中不包含访问物理磁盘所需的SE_MANAGE_VOLUME_NAME等特权。AdjustTokenPrivileges()仅能启用令牌中已存在的特权,无法为普通用户凭空添加这类高权限特权,因此必然返回ERROR_NOT_ALL_ASSIGNED。
可行的替代方案
1. 访问逻辑分区而非物理磁盘
如果需求只是读取/写入磁盘上的特定分区,直接访问逻辑盘符(如\\.\C:)而非物理磁盘设备路径即可。这种方式无需管理员权限,只要当前用户对目标分区拥有标准读写权限,就能正常调用CreateFile()。
2. 通过UAC请求临时管理员权限
如果必须访问物理磁盘,最直接的方式是让程序通过UAC弹窗获取临时管理员权限:
- 在程序的清单文件(
.manifest)中配置requestedExecutionLevel:
若设置为<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo>requireAdministrator,程序启动时会强制弹出UAC请求;若设置为highestAvailable,则会根据当前用户身份自动适配——管理员用户直接以高权限运行,普通用户需输入管理员凭据。
3. 拆分权限敏感逻辑
若不想让整个程序以管理员权限运行,可将物理磁盘访问的核心逻辑拆分为独立模块:
- 编写一个以管理员权限运行的Windows服务或COM组件,专门处理物理磁盘的读写操作。
- 普通权限的主程序通过IPC机制(如命名管道、本地套接字)与该高权限模块通信,间接完成磁盘访问。这种方式既能保证主程序的低权限运行,又能满足物理磁盘访问需求。
4. 修改物理磁盘的ACL(需一次性管理员操作)
如果允许进行一次管理员权限的配置,可修改物理磁盘的访问控制列表(ACL),为普通用户添加访问权限:
- 以管理员身份打开命令提示符,执行
diskpart工具:diskpart list disk select disk X // 将X替换为目标磁盘的编号 detail disk // 查看目标磁盘的设备路径(如\\.\PHYSICALDRIVE0) - 使用
icacls命令为普通用户组添加读写权限:
配置完成后,普通用户后续无需管理员权限即可调用icacls "\\.\PHYSICALDRIVE0" /grant Users:(RW)CreateFile()访问该物理磁盘。
内容的提问来源于stack exchange,提问作者尤俊傑
相关产品推荐
相关产品推荐

