PowerShell映射网络驱动器重启后消失,如何实现持久化?
网络驱动器持久化映射解决方案(带加密凭据)
问题背景
需要实现自动化映射网络驱动器,使用加密存储的凭据(操作人员不可见),但当前脚本映射的驱动器重启后会消失。现有脚本通过New-PSDrive -Persist映射,添加-Scope Global无效;尝试cmdkey时,加密密码无法直接传递,明文密码虽能持久化但违反安全策略。
可行解决方案
方案1:修复cmdkey的加密密码传递问题
核心思路:将加密的SecureString临时转换为明文(仅在内存中操作,不会写入磁盘),存入Windows凭据管理器,再通过net use /persistent:yes实现持久化映射。
修改后的脚本如下:
Net use * /delete /yes $username = "domain\username" $pwdFile = "$env:USERPROFILE\Desktop\xxx_mapping\fs_pwd.txt" $keyFile = "$env:USERPROFILE\Desktop\xxx_mapping\AES.key" $key = Get-Content $keyFile $password = Get-Content $pwdFile | ConvertTo-SecureString -Key $key $fs_path = "\\pathTo\Share" $driveLetter = "P" # 从共享路径提取服务器名称 $serverName = ($fs_path -split '\\')[2] # 临时将SecureString转换为明文(仅内存操作,执行后立即清空) $bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password) $plainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr) [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) # 将凭据存入Windows凭据管理器 cmdkey /add:$serverName /user:$username /pass:$plainPassword # 映射驱动器并开启持久化 net use "$driveLetter:" $fs_path /persistent:yes # 原有文件操作逻辑不变 $filePath = "C:\Windows\someFile" $fileContent = Get-Content -Path $filePath foreach ($line in $fileContent) { if ($line -match "Path of the Remote Work Directory=(.*)") { $remoteWorkDirectory = $matches[1].Trim() $computerName = $env:COMPUTERNAME $outputString = "$remoteWorkDirectory-$computerName" Add-Content -Path "$driveLetter:\evidenceFile.txt" -Value $outputString } } Remove-Item -Path "$env:USERPROFILE\Desktop\xxx_mapping" -Recurse
关键说明
- 明文密码仅在内存中短暂存在,转换后立即通过
ZeroFreeBSTR清空内存,不会留下磁盘痕迹,符合安全要求。 /persistent:yes会将映射配置写入注册表HKCU\Network\$driveLetter,重启后Windows会自动使用凭据管理器中的存储凭据重连驱动器。
方案2:创建用户登录触发的任务计划
若无法使用cmdkey,可通过任务计划在用户每次登录时自动执行映射脚本,间接实现持久化:
- 将脚本移至安全目录(如
C:\Program Files\CustomScripts\),并调整密钥、密码文件的存储路径(避免存桌面被删除)。 - 打开「任务计划程序」,创建新任务:
- 触发器:选择「用户登录时」。
- 操作:启动程序,程序/脚本填
powershell.exe,添加参数:-ExecutionPolicy Bypass -File "C:\Program Files\CustomScripts\你的脚本名.ps1"。 - 设置:勾选「不管用户是否登录都要运行」「使用最高权限运行」,隐藏窗口执行。
原脚本问题原因
New-PSDrive -Persist仅在当前会话有效(或写入注册表),但不会自动将PSCredential中的加密凭据存入Windows凭据管理器。重启后系统无可用凭据重连,导致驱动器消失。
内容的提问来源于stack exchange,提问作者Paulina Nowacka
相关产品推荐
相关产品推荐

