You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),为普通用户添加访问权限:

  1. 以管理员身份打开命令提示符,执行diskpart工具:
    diskpart
    list disk
    select disk X  // 将X替换为目标磁盘的编号
    detail disk    // 查看目标磁盘的设备路径(如\\.\PHYSICALDRIVE0)
    
  2. 使用icacls命令为普通用户组添加读写权限:
    icacls "\\.\PHYSICALDRIVE0" /grant Users:(RW)
    
    配置完成后,普通用户后续无需管理员权限即可调用CreateFile()访问该物理磁盘。

内容的提问来源于stack exchange,提问作者尤俊傑

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:42:53