Как получить читаемый лог WindowsUpdate.log на сервере с ОС Windows Server 2016 с ограниченным доступом в Интернет

How to get a readable WindowsUpdate.log from ETL files on a server running Windows Server 2016 with limited Internet accessПри отладке работы клиента Windows Update в Windows Server 2016 одним из ключевых источников получения информации является лог, который ведёт системная служба "Windows Update". В отличие от предыдущих версий Windows Server, где этот лог имел простой текстовый формат и мог быть прочитан любым текстовым редактором, в Windows Server 2016, как и в Windows 10, прежний текстовый формат лога сменился на бинарный формат Event Trace Log (ETL) механизма Event Tracing for Windows (ETW). Соответственно, для извлечения информации из такого лога требуются дополнительные инструменты типа специализированного командлета PowerShell. А в случае, если диагностируемая серверная система имеет ограниченный доступ в Интернет, то с получением читаемого формата данных ETL у нас могут возникнуть проблемы. Рассмотрим такую проблемную ситуацию и способ её решения.

Итак, при открытии лог-файла C:\Windows\WindowsUpdate.log, который исторически использовался администраторами в предыдущих версиях ОС Windows Server, мы увидим в этом файле сообщение, говорящее о смене формата лога и необходимости использовать PS-командлет Get-WindowsUpdateLog:

Windows Update logs are now generated using ETW (Event Tracing for Windows).
Please run the Get-WindowsUpdateLog PowerShell command to convert ETW traces into a readable WindowsUpdate.log.

For more information, please visit http://go.microsoft.com/fwlink/?LinkId=518345

При вызове командлета Get-WindowsUpdateLog без указания дополнительных параметров из множества лог-файлов с расширением *.etl, хранящихся в каталоге C:\Windows\Logs\WindowsUpdate будет сформирован читаемый текстовый лог-файл WindowsUpdate.log на рабочий стол текущего пользователя, запустившего командлет.

Однако, открыв этот файл, вместо читаемых событий мы можем увидеть нераспознанные записи с разными идентификаторами следующего вида:

...
1601.01.01 03:00:00.0000000 1352  1784  Unknown( 10): GUID=d1317ae8-ec05-3e09-4a50-d3b2ce02f784 (No Format Information found).
1601.01.01 03:00:00.0000000 1352  1784  Unknown( 10): GUID=d1317ae8-ec05-3e09-4a50-d3b2ce02f784 (No Format Information found).
1601.01.01 03:00:00.0000000 1352  1784  Unknown( 63): GUID=e26dfe10-35bf-3106-db9d-9a51a6a0981f (No Format Information found).
1601.01.01 03:00:00.0000000 1352  1784  Unknown( 30): GUID=018fc11d-8257-3169-8741-635574c6ffe0 (No Format Information found).
...

Данная проблема связана с отсутствием доступа к Интернет-сервису, предоставляющему по HTTP-запросу актуальные версии символов отладки (Microsoft Internet Symbol Server), которые используются для интерпретации при обработке ETL-логов.

Такое поведение командлета Get-WindowsUpdateLog имеет место быть на Windows 10 версий до 1709 (OS Build 16299), в том числе и на Windows Server 2016, который относится к версии 1607 (OS Build 14393).
Об этом указано в описании к самому командлету.

В качестве самого простого решения данной проблемы может быть открытие прямого доступа к Интернет-узлу msdl.microsoft.com на пограничном шлюзе или прокси-сервере предприятия. Однако, в некоторых случаях, исходя из требований ИБ, такой доступ открыть не представляется возможным. Как же прочитать логи в таком случае?

В качестве одного из вариантов решения может быть обработка логов на другой машине, имеющей доступ в Интернет. Для этого скопируем *.etl логи на систему Windows 10 или Windows Server 2016, имеющую доступ в Интернет, например во временный каталог C:\Temp\WindowsUpdate\ и выполним обработку копии логов:

Get-WindowsUpdateLog -ETLPath "C:\Temp\WindowsUpdate\" -LogPath "C:\Temp\WU.log"

Либо, без предварительного копирования можем сразу попробовать обработать логи прямо с удалённой машины:

Get-WindowsUpdateLog -ETLPath "\\WS2016srv\C$\Windows\Logs\WindowsUpdate" -LogPath "C:\Temp\WU.log"

Однако, при попытке получить читаемый лог, извлечённый с Windows Server 2016 1607 (14393), например, на более новой системе Windows 10 21H2 (19044) мы можем получить примерно следующий результат:

...
2022.04.05 19:44:14.5857095 1352  2928  Unknown         Unknown
2022.04.05 19:44:14.5857173 1352  2928  Unknown         Unknown
2022.04.05 19:44:15.5861231 1352  1784  Unknown         Unknown
2022.04.05 19:44:15.5861305 1352  1784  Unknown         Unknown
2022.04.05 19:44:15.5882899 1352  1784  Unknown         Unknown
...

При этом свои логи Windows Update с помощью командлета Get-WindowsUpdateLog на этой же системе с Windows 10 21H2 могут формироваться без каких-либо проблем.

Как я понимаю, связано это с тем, что для формирования читаемого лога с Windows Server 2016 1607 нам потребуется иметь символьный кеш, совместимый именно с этой версией ОС.

В качестве обходного решения этой проблемы можно сделать следующее:

  • Сформировать символьный кеш на серверной системе нужной версии, выпустив на время её в Интернет (или только конкретно к узлу msdl.microsoft.com) и выполнив командлет Get-WindowsUpdateLog;
  • Скопировать полученный символьный кеш в общедоступный сетевой каталог и использовать его в дальнейшем в качестве локального источника при работе с других серверов, отключенных от Интернет.

Итак, предоставляем на время какому-либо серверу с аналогичной версией ОС (Windows Server 2016 1607) прямой доступ в Интернет и выполняем на этом сервере командлет Get-WindowsUpdateLog. В ходе выполнения команды сервер подключится к интернет узлу msdl.microsoft.com и наполнит символьный кеш в каталоге:

%temp%\WindowsUpdateLog\SymCache.

То есть, с точки зрения текущего пользователя, который выполняет командлет, путь может иметь вид типа C:\Users{Username}\AppData\Local\Temp\WindowsUpdateLog\SymCache

В нашем примере в каталог символьного кеша было загружено около 14 MB контента.

Windows Update Log Symbols Cache in SymCache folder

Копируем всё содержимое каталога в отдельную сетевую шару, которую в дальнейшем можно будет использовать в качестве источника символьного кеша для всех серверов с аналогичной версией ОС и не имеющих доступа в Интернет.

После этого на сервере, не имеющем доступа в Интернет, выполняем команду формирования читаемого лога с использованием символьного кеша из сетевой шары:

Get-WindowsUpdateLog -SymbolServer "\\FileSrv\WS2016\WUSymCache"

В результате мы должны получить понятный читаемый лог файл на рабочем столе текущего пользователя.

Readable WindowsUpdate.log on Windows Server 2016

Получить больше информации о логах, относящихся к работе Windows Update, в том числе и о структуре этих логов, можно из документа "Microsoft Docs : Windows - Deployment - Windows Update log files".

Обратите внимание также на то, что при отладке работы клиента Windows Update в Windows Server 2016 перед погружением в вышеописанный ETL-лог для первичного анализа ситуации могут пригодится журналы Event Viewer, которые можно найти в разделе Applications and Services Logs > Microsoft > Windows > WindowsUpdateClient.

Windows Update Client Logs in Event Viewer in Windows Server 2016


Дополнительные источники информации:

Добавить комментарий