未启用PSRemoting时远程为域用户删除并重映射网络驱动器
原方案失效原因
远程调用WMI查询Win32_MappedLogicalDisk拿不到目标驱动器信息是必然结果:该WMI类仅能枚举执行查询时所用安全上下文对应的用户映射盘,你用域管账号远程连目标机WMI时,枚举到的是域管账号在目标机上的会话映射,根本读不到普通登录用户自己的映射配置,这也是同一段代码本地执行正常、远程查询返回空的核心原因,和PSRemoting是否启用无关。
可直接落地的实现方案
不需要提前远程查询盘符,把匹配、删除、重映射的逻辑全部放到目标机本地执行即可,全程只依赖域环境默认开启的C$管理共享、默认计划任务远程管理权限,不需要额外开服务或者改配置:
- 先准备本地执行的映射逻辑脚本,脚本自身完成关键词匹配、盘符获取、重映射操作,执行完自动清理残留
适配后的批处理脚本逻辑如下,兼容性覆盖所有Windows版本,无PowerShell版本依赖:@echo off set TARGET_MATCH_PHRASE=替换为你要匹配的旧路径关键词 set NEW_SHARE_PATH=替换为新的共享文件夹全路径 :: 遍历当前用户所有网络映射,匹配到含关键词的项后执行删除+重映射 for /f "tokens=2 delims= " %%d in ('net use ^| findstr /i /c:"%TARGET_MATCH_PHRASE%"') do ( net use %%d /delete /y net use %%d "%NEW_SHARE_PATH%" /persistent:yes ) :: 执行完成后自删计划任务和脚本本身 schtasks /delete /tn "\ITS\DriveTask" /f del /f /q "%~f0" - 用域管权限在你本地执行以下PowerShell代码,给目标机下发脚本、创建计划任务并立即触发:
$DestPC = "填写目标PC的主机名" $MatchPhrase = "填写旧路径匹配关键词" $NewShare = "填写新的共享路径,格式如\\fileserver01\deptshare" # 确保目标机上的脚本存放目录存在 New-Item -Path "\\$DestPC\C$\ITS" -ItemType Directory -Force | Out-Null # 生成适配当前配置的批处理脚本并写入目标机 $scriptContent = @"
@echo off
for /f "tokens=2 delims= " %%d in ('net use ^| findstr /i /c:"$MatchPhrase"') do (
net use %%d /delete /y
net use %%d "$NewShare" /persistent:yes
)
schtasks /delete /tn "\ITS\DriveTask" /f
del /f /q "%~f0"
"@
$scriptContent | Out-File -FilePath "\$DestPC\C$\ITS\DriveMap.bat" -Encoding Ascii -Force
# 创建以当前登录交互用户身份运行的计划任务,执行完自动销毁
schtasks /create /s $DestPC /tn "\ITS\DriveTask" /tr "C:\ITS\DriveMap.bat" /sc once /st 00:00 /ru "Interactive" /f /z
# 立即触发任务执行,无需等待用户重新登录
schtasks /run /s $DestPC /tn "\ITS\DriveTask"
```
方案说明
- 全程不依赖PSRemoting、不依赖远程WMI枚举用户配置,域环境默认配置下即可运行
- 匹配逻辑在目标机当前登录用户的上下文下执行,能准确识别到用户自己的网络映射,不存在权限隔离导致的查询失败问题
- 脚本和计划任务执行完成后会自动清理,不会在目标机留下残留配置
- 如果下发脚本时目标机没有用户登录,任务会在用户下次登录时自动触发,不会漏执行
- 匹配逻辑为不区分大小写的模糊匹配,和原代码中
-like "*Phrase*"的匹配规则完全一致;如果同一用户下有多个匹配关键词的映射盘,脚本会全部完成替换,如需仅替换第一个,在for循环内第一行后加goto :eof即可。
内容的提问来源于stack exchange,提问作者Alex Thibodeaux

