PowerShell 5.1登录脚本对本地管理员映射网络驱动器异常
问题分析与解决:管理员GPO登录脚本映射SMB驱动器不显示
核心问题
域管理员用户通过GPO登录脚本执行New-SMBMapping时,脚本日志明确显示驱动器映射成功,但Windows资源管理器和交互式Get-SMBMapping都无法看到映射结果;非管理员用户无论通过GPO还是交互式运行脚本都正常,管理员仅在交互式运行脚本时能正常看到映射。测试环境为Windows 11 Enterprise 23H2/24H2。
根本原因
这是Windows UAC虚拟化隔离机制导致的:
- 管理员登录系统时,会同时创建两个运行上下文:标准用户上下文和管理员上下文
- GPO登录脚本默认在标准用户上下文执行,映射的驱动器仅存在于该上下文环境中
- 管理员默认打开的Windows资源管理器运行在管理员上下文,无法跨上下文识别标准用户环境下创建的驱动器映射
- 交互式运行脚本时,若以管理员权限启动PowerShell,映射会直接创建在管理员上下文,因此能被资源管理器正常识别
解决方案
方案1:禁用资源管理器的UAC虚拟化(推荐)
通过组策略强制资源管理器以标准用户权限运行,使其能识别GPO脚本在标准上下文创建的映射:
- 打开组策略编辑器(
gpedit.msc) - 导航路径:
计算机配置 > 管理模板 > Windows组件 > 文件资源管理器 - 启用**「以管理员批准模式运行文件资源管理器」**(此设置会让资源管理器以标准权限启动,消除UAC上下文隔离影响)
方案2:脚本中手动同步注册表映射配置
在New-SmbMapping执行后,手动写入用户注册表的驱动器映射配置,确保管理员上下文能读取到映射信息:
# 在Mount-NetworkDrive函数的New-SmbMapping后添加以下代码 $driveLetter = $LocalPath.TrimEnd(':') $regPath = "HKCU:\Network\$driveLetter" # 创建或更新注册表项 if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force | Out-Null } Set-ItemProperty -Path $regPath -Name RemotePath -Value $RemotePath Set-ItemProperty -Path $regPath -Name Persistent -Value 1 Set-ItemProperty -Path $regPath -Name UserName -Value $env:USERNAME
方案3:改用组策略首选项映射驱动器
放弃PowerShell脚本,直接使用组策略内置的驱动器映射功能,该功能会自动处理UAC上下文隔离问题:
- 打开组策略编辑器,导航到
用户配置 > 首选项 > Windows设置 > 驱动器映射 - 创建新的驱动器映射项,配置盘符、共享路径、持久化等属性
- 应用组策略后,管理员用户登录时会自动完成映射,且资源管理器能正常识别
验证步骤
修改完成后,让管理员用户重新登录,执行以下操作验证:
- 打开Windows资源管理器,检查目标驱动器是否显示
- 运行
Get-SMBMapping命令,确认映射条目存在 - 重启系统后再次验证,确保映射具备持久化能力
内容的提问来源于stack exchange,提问作者JWW-CSISD
相关产品推荐
相关产品推荐

