Ws management не удается обработать запрос. NetZ: Непонятный TrustedHosts

При настройке WinRM на серверах в домене Active Directory столкнулся со странной проблемой. После того как служба WinRM была настроена и включена на сервере, к ней разрешено удалённое подключение через Windows PowerShell Remoting, при попытке удаленного подключения к данному серверу с помощью команды Enter-PSSession msk-dp01 в консоли PowerShell появляется следующая ошибка WinRM:

Enter-PSSession: Сбой подключения к удаленному серверу msk-dp01. Сообщение об ошибке: Клиенту WinRM не удается обработать запрос. Невозможно определить тип содержимого ответа HTTP от компьютера назначения. Тип содержимого не является допустимым или отсутствует. Подробности см. в разделе справки «about_Remote_Troubleshooting».

строка:1 знак:1

Enter-PSSession msk-dp01

+ ~~~~~~~~~~~~~~~~~~~~~~~~~

В английской версии Windows ошибка выглядит так:

PS C:\Windows\system32> Enter-PSSession msk-dp01

Enter-PSSession: Connecting to remote server msk-dp01 failed with the following error message: The WinRM client received an HTTP bad request status (400), but the remote service did not include any other information about the cause of the failure. For more information, see the about_Remote_Troubleshooting Help topic.

At line:1 char:1

Enter-PSSession msk-dp01

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CategoryInfo: InvalidArgument: (msk-dp01:String) , PSRemotingTransportException

FullyQualifiedErrorId: CreateRemoteRunspaceFailed

При этом на сервере порты WinRm (5985/HTTP, 5986/HTTPS) отвечают и принимают соединения. Проверить доступность TCP портов WinRM можно с помощью или командлета PowerShell :

TNC msk-dp01 –port 5985


Как оказалось, проблема оказалась связана с большим размером токена Kerberos у пользователя, за счет того, что пользователь состоит в слишком большом количестве доменных групп. Ошибка возникает при превышении размера токена 16 Кб (см статью ). В нашей ситуации происходит все тоже самое, сервер WinRm сбрасывает запрос от клиента, т.к. размер заголовка пакета аутентификации превышает 16 Кб. В статье по ссылке мы упоминали, что по-умолчанию в IIS используется размер HTTP заголовка не более 16 Кб, и в случае проблем с HTTP аутентификацией из за большого токена пользователя, его нужно увеличить до 64 Кб

Чтобы исправить проблему, нужно уменьшить размер токена (уменьшить количество групп безопасности, в которых состоит пользователь), а если это невозможно, тогда в редакторе реестра на сервере нужно изменить значение следующих DWORD параметров реестра в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters

  • MaxFieldLength
  • MaxRequestBytes увеличить до 0000ffff (65535)

Осталось перезагрузить сервер и проверить подключение WinRm через Enter-PSSession с клиента.

У меня как-то раз возникли проблемы с WinRM на двух серверах.

1. SETSPN
На одном проблема была в том, что SPN записи HTTP/<имя сервера> были зарегистрирована для какой-то "левой" учётной записи пользователя.

Нашёл эти записи командой
setspn -F -Q */<имя сервера>

Затем удалил их командами
setspn -D http/<имя сервера>.<имя домена> <имя домена>\<левая учётная запись>
setspn -D http/<имя сервера> <имя домена>\<левая учётная запись>

Затем enable-psremoting -force выполнилась успешно.

2. LANGUAGE PACK
А на втором сервере была хитрая проблема якобы с фаерволлом Unable to check the status of the firewall , перерыл кучу сайтов, а решение обнаружил интуитивно основываясь на ответе по поводу установленного Language Pack.

WinRm QuickConfig
WinRM service is already running on this machine.
WSManFault
Message
ProviderFault
WSManFault
Message = Unable to check the status of the firewall.

Error number: -2147024894 0x80070002
The system cannot find the file specified.

В ответе было написно, что данная ошибка лечится удалением дополнительного Language Pack.
Но я поступил иначе. У меня Английская операционка с дополнительным русским language pack. Я просто изменил язык интерфейса на Русский.
Панель управления, Язык и региональные стандарты, Языки и клавиатуры изменил язык интерфейса с англиского на русский.
Выполнил logoff и вошёл снова. Открыл PowerShell и повторил WinRm QuickConfig

PS C:\Windows\system32> winrm qc

Служба WinRM не настроена на разрешение удаленного управления компьютером.
Необходимо внести следующие изменения:

Создайте прослушиватель WinRM на HTTP://* для приема запросов WS-Man на любом из IP-адресов этого компьютера.

Выполнить изменения ? y

Служба WinRM обновлена для удаленного управления.

Создан прослушиватель WinRM на HTTP://* для приема запросов WS-Man на любом из IP-адресов этого компьютера.

Выполнилось успешно, но всё же не достаточно.

Появилась ошибка Access Denied при попытке выполнить команды удалённо на этом сервере с другого компа.

New-PSSession: [<имя сервера>] Connecting to remote server <имя сервера> failed with the following error message: Access is denied. For more information, see the about_Remote_Troubleshooting Help topic.

Тогда я повторил Enable-PsRemoting

PS C:\Windows\system32> Enable-PsRemoting

Быстрая настройка WinRM
Запуск команды "Set-WSManQuickConfig" для включения на данном компьютере удаленного управления с помощью службы WinRM.
Необходимые действия.
1. Запуск или перезапуск (если уже запущена) службы WinRM.
2. Изменение типа службы WinRM на "автозапуск".
3. Создание прослушивателя для приема запросов на любом IP-адресе.
4. Настройка исключений брандмауэра для трафика службы WS-Management (только для протокола http).

Продолжить?

(значением по умолчанию является "Y"):a
Служба WinRM уже настроена на прием запросов на компьютере.
Служба WinRM уже настроена на разрешение удаленного управления компьютером.

Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Регистрация конфигурации сеанса" над целевым объектом "Конфигурация сеанса
"Microsoft.PowerShell32" не найдена. Будет выполнена команда "Register-PSSessionConfiguration Microsoft.PowerShell32
-processorarchitecture x86 -force" для создания конфигурации сеанса "Microsoft.PowerShell32". Служба WinRM будет
перезапущена.".
[Y] Да - Y [A] Да для всех - A [N] Нет - N [L] Нет для всех - L [S] Приостановить - S [?] Справка
(значением по умолчанию является "Y"):a

После этого WinRM на этом сервере заработал как надо.

На днях мой коллега задал мне вопрос, на который я не смог ответить с ходу. Ему не удавалось подключиться, с помощью powershell remoting, к удаленному серверу, находящемуся в другом домене. При попытке сделать это он получал примерно вот такое сообщение

Я, в свою очередь, тоже попробовал сделать это в разных окружениях и получил несколько разных результатов:

После нескольких экспериментов мой коллега сообщил, что если добавить адрес удаленного сервера в TrustedHosts на клиентской машине, то все работает. Все довольно странно и запутано. По этому – давайте подробнее разберем все эти ситуации.

Прежде всего стоит отметить, что проблема возникает, когда используются не доменные окружения. То есть, если клиент и сервер находятся не в одном домене. Наиболее часто, на мой взгляд, встречаются три ситуации:

    компьютеры сервера и клиента расположены в разных доменах

    компьютер сервера расположен в домене а клиент – вне домена

    компьютеры сервера и клиента не входят в домен


Кроме того, исходя из сообщений об ошибках (да, их надо читать внимательно), и, соответственно, из методов обращения к серверу, есть две ситуации:

  • при обращении к серверу, клиент указывает IP-адрес в качестве адреса назначения
  • при обращении к серверу, клиент указывает имя в качестве адреса назначения

К сожалению в интернетах нет однозначного мнения по поводу того, где, на сервере или клиенте, нужно задавать параметр TrustedHosts, и нужно ли это вообще делать. На что это влияет и все такое. В целом, информация довольно скудная по этому поводу. Поэтому, после долгого забега по гуглу, я решил обратиться, куда бы вы думали – да, к первоисточнику. А именно – к спецификации на ws-management . Про параметр TrustedHosts там сказано следующее:

TrustedHosts: Contains host names to which the Web Services Management Protocol Extensions for Windows Vista clients are allowed to send requests by using an authentication scheme and transport that does not allow the client to authenticate the service , such as Basic over HTTP.

The specified host names may be either Internet host names or IP addresses. TrustedHosts

  • Blank: No hosts are trusted.
  • The asterisk "*" character: All hosts are trusted.
  • A list of host name patterns separated by the comma "," character, in which each host name can be one of four possible values:
    • String starting with the asterisk "*" character and containing at least two characters. All hosts that share the suffix are trusted.
    • String ending with the asterisk "*" character and containing at least two characters. All hosts that share the prefix are trusted.
    • The exact string " ": All NetBIOS names are trusted (for example, strings that do not contain the period "." character).
    • A string without the asterisk "*" character: The host named by the string is trusted.

The default value for the element MUST be a blank string.

Основная идея выделена. И это означает, что параметр TrustedHosts нужно использовать на клиенте . В этом списке указываются машины, при работе с которыми невозможно использовать схемы с поддержкой взаимной аутентификации . Таким образом, если и клиент и сервер находятся в одном домене, то для подключения вы можете использовать простую команду без дополнительных параметров.

Следующий этап – два домена с доверительными отношениями. В этом случае тоже нет необходимости в TrustedHosts. Однако необходимо обеспечить корректное разрешение имен. Однако, скажете вы, ведь в домене можно обращаться не только по имени, а еще и по адресу, и все должно работать корректно. А у нас, при попытке использовать адрес, вываливается ошибка. И вот тут возникает необходимость внимательно прочитать содержимое ошибки:

Проверку подлинности по умолчанию можно использовать с IP-адресом при следующих условиях: Транспортом является HTTPS или назначением является список TrustedHosts.

Прежде всего видим, что в TrustedHosts нужно указывать именно назначение. А почему такое ограничение на использование IP-адреса? Об этом написано в блоге . Вкратце, там сказано, что нельзя в качестве использовать IP-адреса в синтаксисе записи SPN . И если в windows xp/2003 это работало то в Vista и старше при использовании IP-адреса в назначении не будет даже попыток использовать kerberos . Отсюда и ошибка: раз не используется протокол с взаимной аутентификацией – используйте HTTPS или пропишите TrustedHosts. Для того чтобы убедиться в этом, вы можете воспользоваться вашим любимым сниффером. В нем вы увидите, что клиент даже не пытается установить связь с сервером, если вы указываете в качестве назначения адрес. Ошибка выдается сразу. Более подробно про SPN вы можете так же прочесть в моей статье .

И наконец – не доменное окружение. Powershell знает, что клиентская машина не в домене. Значит kerberos по определению не возможен. Следовательно либо TrustedHosts либо HTTPS.