使用Powershell命令行启动RDP会话无法跳过密码弹窗该如何解决
无密码RDP会话脚本问题排查与实现方案
现有脚本失效原因
cmdkey的/generic参数配置的凭据类型与RDP客户端的匹配规则不一致:mstsc默认会查找前缀为TERMSRV/的目标凭据,你直接填写服务器IP作为通用凭据目标的话,RDP客户端无法识别到对应预存凭据,因此会弹出密码提示。- 本地组策略或目标服务器的RDP配置限制:如果目标服务器强制要求网络级别身份验证(NLA),或本地策略禁止使用预存的通用凭据进行RDP认证,也会导致凭据匹配失效。
- 若填写的服务器地址附带端口号,
cmdkey的凭据目标名称与mstsc的寻址规则不匹配,也会触发密码验证。
兼容PowerShell环境的实现方案
方案1:修正cmdkey参数(轻量方案,无额外依赖)
将凭据的目标名称前缀加上TERMSRV/即可匹配RDP客户端的凭据检索规则,代码如下:
# 添加对应RDP类型的预存凭据 cmdkey /generic:"TERMSRV/替换为你的服务器IP" /user:"替换为实际用户名" /pass:"替换为实际密码" # 启动RDP连接 mstsc /v:"替换为你的服务器IP" # 可选:连接建立后删除凭据,避免敏感信息留存在本地 # cmdkey /delete:"TERMSRV/替换为你的服务器IP"
方案2:生成临时RDP配置文件(兼容性更强,适配NLA、带端口的连接场景)
如果方案1受组策略限制不生效,可以通过PowerShell生成带加密密码的临时RDP文件启动连接,代码如下:
$serverAddr = "替换为你的服务器IP(带端口也可,例:192.168.1.10:3390)" $username = "替换为实际用户名" $password = "替换为实际密码" $tempRdpPath = Join-Path $env:TEMP "temp_rdp_$($serverAddr.Replace(':','_')).rdp" # 写入RDP配置,密码采用系统级加密存储,不会明文暴露 $rdpContent = @" full address:s:$serverAddr username:s:$username password 51:b:$($([System.Security.Cryptography.ProtectedData]::Protect([System.Text.Encoding]::Unicode.GetBytes($password), $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)) | ForEach-Object { $_.ToString('x2') } -join '') authentication level:i:2 prompt for credentials:i:0 "@ $rdpContent | Out-File $tempRdpPath -Encoding Unicode # 启动RDP连接 Start-Process mstsc -ArgumentList $tempRdpPath # 连接启动后删除临时RDP文件,避免敏感信息残留 Start-Sleep -Seconds 3 Remove-Item $tempRdpPath -Force
两种方案均可以在PowerShell环境下正常运行,方案2的兼容性更强,不受大部分系统策略限制。
内容的提问来源于stack exchange,提问作者Ilay
相关产品推荐
相关产品推荐

