![远程 Powershell 不起作用,但 test-wsman 起作用](https://linux22.com/image/711537/%E8%BF%9C%E7%A8%8B%20Powershell%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%8C%E4%BD%86%20test-wsman%20%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我需要编写一些例行任务脚本,从服务器A远程执行到许多主机,但其中有几个无法执行该脚本。
如果我执行这个:
$cred = Get-Credential myUser
Invoke-Command -ComputerName serverB -ScriptBlock{gci d:\} -Credential $cred
或这个:
Test-WSMan -ComputerName ServerB -Credential $cred -Authentication Negotiate
我收到以下错误
[SeverB] 连接到远程服务器 ServerB 失败,并显示以下错误消息:WinRM 无法处理请求。使用协商身份验证时发生以下错误,错误代码为 0x80090322:发生未知的安全错误。可能的原因包括:-指定的用户名或密码无效。-未指定身份验证方法和用户名时使用 Kerberos。-Kerberos 接受域用户名,但不接受本地用户名。-远程计算机名称和端口的服务主体名称 (SPN) 不存在。-客户端和远程计算机位于不同的域中,并且两个域之间没有信任。检查上述问题后,请尝试以下操作:-检查事件查看器中与身份验证相关的事件。-更改身份验证方法;将目标计算机添加到 WinRM TrustedHosts 配置设置或使用 HTTPS 传输。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。-有关 WinRM 配置的更多信息,请运行以下命令:winrm help config。有关更多信息,请参阅 about_Remote_Troubleshooting 帮助主题。+ CategoryInfo : OpenError: (serverB:String) [], PSRemotingTransportException + FullyQualifiedErrorId : -2144108387,PSSessionStateBroken
但是当我单独使用 test-wsman 时:
Test-WSMan -ComputerName ServerB
wsmid :
http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor : Microsoft Corporation
ProductVersion : OS: 0.0.0 SP: 0.0 Stack: 3.0
我不知道问题出在哪里。我已经尝试使用启用 psremote,微软,检查防火墙设置和用户权限
答案1
似乎是现有 spn 映射问题,在 powershell 中您可以删除 spn 帐户并重试。
setspn -D HTTP/SERVERNAME <domain account>
setspn -D HTTP/SERVERNAME.DOMAINAME.COM <domain account>
如果问题仍然存在,您可以检查使用 IP 地址(IPv4)而不是服务器名称来绕过 Kerberos 错误。
来源 https://serverfault.com/questions/580411/windows-server-manager-kerberos-error-0x80090322
答案2
我解决了我的问题。Kerberos 身份验证、远程 Powershell 和集成服务之间存在已知问题(服务器正在运行该应用程序)。信息可以找到这里和这里
我必须为服务器(serverB_alias)创建一个 A 记录 DNS,并将该服务器的 HTTP spn 设置为指定 wsman 尝试连接的端口(5985)的帐户。
setspn -s http/serverB domain\user
setspn -s http/serverB.domain domain\user
setspn -s http/serverB_alias:5985 domain\user
setspn -s http/serverB_alias.domain:5985 domain\user
最后,我使用以下命令将别名 DNS 添加到服务器 A 受信任的主机列表中:
$curValue = (get-item wsman:\localhost\Client\TrustedHosts).value
set-item wsman:\localhost\Client\TrustedHosts -value "$curValue, serverB_alias"
答案3
我在 VMWare 上遇到了这个问题并按照以下步骤修复了它
我从 Active Directory 用户和计算机中删除了 ServerA 和 ServerB。
然后我将 ServerA 和 ServerB 的网络 ID 从域更改为工作组
然后我重新启动了 ServerA 和 ServerB,并将它们移回域
Enable-PSRemoting -force
然后,如果 ServerA 和 ServerBWinRM service
均未运行,我将在它们上运行。