У меня есть среда с 16 vms на хосте. Все они работают под управлением 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? Что еще предстоит проверить, чтобы понять суть проблемы?
Статья об архитектуре 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 (http и https для WinRM).