GitLab CI/CD执行New-PSSession跨Windows连接失败求助
解决方案
针对GitLab CI/CD执行PowerShell远程脚本时出现的WinRM 0x8009030d错误,可按以下步骤排查修复:
1. 显式指定WinRM身份验证方式
脚本中New-PSSession默认使用Negotiate认证,在CI/CD的非交互式服务账户环境下,容易因Kerberos验证失败触发错误。修改为NTLM认证,适配本地管理员账户场景:
# 替换原New-PSSession行 $session = New-PSSession -ComputerName $remoteServer -Credential $credential -Authentication NTLM -SessionOption (New-PSSessionOption -SkipCNCheck)
2. 调整GitLab Runner的运行账户权限
GitLab Runner默认以Local System账户运行时,无网络身份验证权限,无法发起WinRM远程连接。需切换为具备本地管理员权限的账户:
- 打开Windows服务管理器,找到
GitLab Runner服务 - 右键选择「属性」→「登录」选项卡
- 选择「此账户」,输入有权限的本地/域账户及密码,重启服务
3. 配置远程服务器WinRM允许本地账户访问
在目标Windows服务器上执行以下命令,开启NTLM认证及非加密访问(若未配置HTTPS):
# 启用NTLM身份验证 Set-Item WSMan:\localhost\Service\Auth\NTLM -Value $true # 允许非加密连接(临时方案,建议后续配置HTTPS加密) Set-Item WSMan:\localhost\Service\AllowUnencrypted -Value $true
4. 修复TrustedHosts覆盖问题
原脚本会直接覆盖TrustedHosts配置,可能导致Runner环境中其他可信主机设置丢失,改为追加模式:
# 替换原Set-Item行 Set-Item WSMan:\localhost\Client\TrustedHosts -Value "$((Get-Item WSMan:\localhost\Client\TrustedHosts).Value),$remoteServer" -Force
5. 安全存储凭据(可选但推荐)
避免脚本硬编码密码,使用GitLab CI/CD变量存储敏感信息:
- 在GitLab项目「设置」→「CI/CD」→「变量」中添加
REMOTE_SERVER_PASSWORD变量 - 脚本中引用变量:
$password = $env:REMOTE_SERVER_PASSWORD
内容的提问来源于stack exchange,提问作者op-code
相关产品推荐
相关产品推荐

