我有一个环境,其中一台主机上有 16 个虚拟机。它们都运行 Windows2008R2。有一次,我让 powershell 远程处理在除一台之外的所有服务器上工作。然后我与另外两台服务器失去了联系。这至少可以说很烦人。每次我回来时都会发现 WinRM 正在作为服务运行,但它仍然不起作用。
它设置为使用 ssl。Invoke-Command -ComputerName "BadMachine" -ScriptBlock {Get-Service | Where-Object {($_.Name -eq "WinRM") -and ($_.Status -eq "Running")}} -ErrorAction Stop -UseSSL -Credential(Get-Credential)
结果是众所周知的
[BadMachine] Connecting to remote server BadMachine failed with the
following error message : WinRM cannot complete the operation. Verify...
etc.,etc.,etc.
在坏的机器上,“winrm quickconfig”表示 WinRM 服务已在运行,然后显示上述错误。
在坏的机器上,Get-Service "WinRM"
返回一个很好的对象,说明服务正在运行。
在坏的机器上winrm id
不会返回任何内容(在好的机器上它会给出完整的IdentifyResponse)。
winrm get wmicimv2/Win32_Service?Name=WinRM
给出上述错误(在良好的机器上它返回状态)。
cd wsman:
允许我切换到 wsman 提供程序,并且有 localhost。但导航到 localhost 后,那里什么也没有。因此,cd WSMan:\localhost\Listener
结果为Cannot find path
。
netsh http show urlacl
没有产生任何结果(在良好的机器上它返回 URL 保留。)
大多数文章都描述了如何设置 powershell 远程处理,并可能讨论如何排除某些部分的故障。但是,显然 winrm 和 powershell 远程处理可能出现很多问题,所以我的问题是:
如何修复此 WinRM 安装?它们是 Hyper-V 主机上的虚拟机,这一事实是否会使事情变得复杂?还需要测试什么才能找到问题的核心?
答案1
一篇有关 WinRM 架构的文章让我开始调查 Http.sys。由于 IIS 运行正常,我不会怀疑 Http.sys。该命令netsh http show urlacl
显示没有保留的 URL。
https://support.microsoft.com/en-us/help/820129/http.sys-registry-settings-for-windows帮助我将坏机器的注册表与好机器进行比较。坏机器上不存在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters\UrlAclInfo 的注册表值。此外,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters\SslBindingInfo\0.0.0.0:5986(winrm 绑定)的值也不存在。我不知道是什么原因造成的。
由于我环境中的所有服务器看起来都差不多,我导出了上述密钥,并导入了故障机器注册表中的密钥。我猜这只有在两台机器足够相似的情况下才有可能。但是,它为我解决了问题。运行后,Enable-PSRemoting
我现在可以访问环境中的所有机器。
通过实验,我发现 SslBindingInfo(netsh http show sslcert
)应该显示端口 5986(winrm,您想要用于 -UseSSL 的证书)的绑定,acl 应该包含端口 5357 和 5358(用于网络发现的 http 和 https?)、47001(http,wsman)、5985 和 5986(用于 winrm 的 http 和 https)的保留。