管理员权限下调用GetFileAttributesW访问映射网络驱动器报错排查
问题原因
这是Windows UAC(用户账户控制)的会话隔离机制导致的:
- 普通用户模式下映射的网络驱动器是绑定在当前低权限用户会话中的;
- 用管理员权限启动程序时,系统会创建一个独立的高权限用户会话,两个会话的驱动器映射完全隔离,因此高权限进程看不到普通会话里的
Y:\; - 调用
EnablePrivilege()提升权限无效,因为该函数仅调整进程的权限令牌,无法解决跨会话的资源隔离问题。
修复方案
- 优先使用UNC路径(最稳妥):放弃驱动器号,直接用
\\服务器名\共享目录作为路径参数,比如把代码里的GetFileAttributesW("Y:\\")改成GetFileAttributesW(L"\\\\YourServer\\YourShare")。UNC路径不受UAC会话隔离影响,普通和管理员权限都能直接访问。 - 在管理员会话中重新映射驱动器:如果必须使用驱动器号,打开管理员权限的命令提示符,执行命令:
完成后管理员会话会生成net use Y: \\服务器名\共享路径 /persistent:yesY:\的映射,高权限进程即可识别。 - 修改注册表关闭会话隔离(谨慎使用):
- 打开注册表编辑器(
regedit); - 定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System; - 新建DWORD类型的
EnableLinkedConnections,设置值为1; - 重启电脑后,管理员会话即可访问普通用户映射的驱动器。
注意:该操作会削弱UAC的安全隔离效果,可能带来潜在风险,非必要不推荐。
- 打开注册表编辑器(
- 代码层面自动同步映射:如果需要自动化处理,可以调用Windows网络资源API(
WNetOpenEnum、WNetEnumResource)枚举普通用户的网络驱动器映射,再在管理员进程中调用WNetAddConnection2手动创建对应映射。这种方式适合批量或自动化场景,但需处理用户权限和会话识别的细节。
内容的提问来源于stack exchange,提问作者DrAssExplosion
相关产品推荐
相关产品推荐

