PowerShell远程执行脚本遇WinRM错误及本地权限问题求助
问题描述
我的代码如下:
$securePassword = $password |ConvertTo-SecureString -AsPlainText -Force $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $securePassword Invoke-Command -FilePath "C:\Users\CompName\Desktop\PowerShell Scripts\CloseWinCC.ps1" -ComputerName "CompName" -Credential $cred
连接远程服务器"CompName"失败,错误信息:
WinRM客户端无法处理请求。如果身份验证方案不是Kerberos,或者客户端计算机未加入域,则必须使用HTTPS传输,或者将目标计算机添加到TrustedHosts配置设置中。请使用winrm.cmd配置TrustedHosts。请注意,TrustedHosts列表中的计算机可能不会被验证。
我尝试本地运行以下代码:
Invoke-Command -FilePath "C:\Users\CompName\Desktop\PowerShell Scripts\CloseWinCC.ps1" -ComputerName localhost -Credential $cred
但本地运行也报错:连接远程服务器localhost失败,错误信息:拒绝访问。
更新:已执行以下命令,但远程连接仍报相同错误:
Enable-PSRemoting -SkipNetworkProfileCheck -Force
解决方案
一、本地连接"拒绝访问"的原因及解决
- UAC远程限制:默认情况下,本地远程调用时,即使使用管理员账户,也会受UAC限制无法直接执行。
- 解决:以管理员身份运行PowerShell;或修改本地UAC远程设置,执行命令:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f Restart-Service WinRM
- 解决:以管理员身份运行PowerShell;或修改本地UAC远程设置,执行命令:
- 权限不足:确保
$cred对应的账户拥有本地远程执行权限,需加入本地的Remote Management Users组,或直接使用本地管理员账户。
二、远程服务器"CompName"连接失败的原因及解决
错误提示明确说明:非域环境下,非Kerberos认证必须配置TrustedHosts或使用HTTPS传输。
方法1:配置本地TrustedHosts(最简方案)
以管理员身份在本地PowerShell执行,将目标服务器加入信任列表:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "CompName" -Concatenate
- 若需信任所有主机,可执行
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"(生产环境不建议) - 修改后重启WinRM服务:
Restart-Service WinRM
方法2:使用HTTPS传输(更安全)
如果需要更高安全性,可在目标服务器配置WinRM的HTTPS监听:
- 在目标服务器生成自签名证书:
$cert = New-SelfSignedCertificate -DnsName "CompName" -CertStoreLocation "Cert:\LocalMachine\My" - 配置WinRM使用该证书:
winrm create winrm/config/Listener?Address=*+Transport=HTTPS "@{Hostname=`"CompName`"; CertificateThumbprint=`"$($cert.Thumbprint)`"}" - 本地连接时指定使用HTTPS:
Invoke-Command -FilePath "C:\Users\CompName\Desktop\PowerShell Scripts\CloseWinCC.ps1" -ComputerName "CompName" -Credential $cred -UseSSL
额外注意事项
- 确保目标服务器WinRM服务已启动,防火墙允许WinRM端口(HTTP默认5985,HTTPS默认5986)
- 若目标服务器为工作组环境,
$cred必须是目标服务器的本地管理员账户(或拥有远程执行权限的账户)
内容的提问来源于stack exchange,提问作者Anne Marie
相关产品推荐
相关产品推荐

