Назад | Перейти на главную страницу

Можно ли определить статус Центра обновления Windows через реестр, чтобы увидеть, «полностью ли обновлена» система?

Я хотел бы иметь возможность проверять статус обновления компьютера, запрашивая реестр. Я специально хотел бы, чтобы некоторые проверяли, "полностью ли обновлен" статус обновления компьютера.

Я просмотрел множество записей в реестре, но не смог найти ни одной, которая имеет статус обновления компьютера.

Какие параметры у меня есть, чтобы проверить статус обновления Windows?

Ближайшим к реестру, который я могу найти, является Windows Update log файл. Единственный другой способ - получить к нему доступ через COM API.

Я поговорил с менеджером Microsoft, отвечающим за Windows Update (Дэйв Рот), и он сказал, что вам ни в коем случае не следует пытаться получить статус Центра обновления Windows через реестр. Он сказал, что вам следует использовать COM API для получения статуса путем выполнения метода поиска и использования возвращенных результатов для статуса обновления вашего компьютера.

Он также дал мне этот совет:

В качестве простой информации, чтобы проверить, какие обновления установлены, позвоните IUpdateSearcher::Search с участием IsInstalled=1 создаст updatecollection объект, содержащий все установленные обновления. Вы можете пройтись по нему, чтобы увидеть, что уже установлено.

Расширяя его совет, вы потенциально можете вызвать этот метод с помощью IsInstalled=0 чтобы увидеть, какие обновления не установлены. (см. пример PowerShell ниже).


Файл журнала Центра обновления Windows

Файл журнала Центра обновления Windows - это хороший способ узнать текущее состояние Центра обновления Windows. Этот метод был бы хорош, если бы вы могли получить доступ только к файловой системе и не имели доступа к API или другим фреймворкам / платформам и тому подобному.

Вы можете найти его по этому пути:
%windir%\Windowsupdate.log

Файл журнала Центра обновления Windows имеет следующий формат:
Date Time PID TID Component Text

Пример строки с данными шаблона будет такой:
[date][time] [PID][TID][Component][Text]

Вот полный пример:
2005-06-0118:30:03 992810Agent * WU client version 5.8.0.2468

Вот пример, в котором агент Центра обновления Windows выполняет поиск доступных обновлений и выводит результаты:

2005-06-0212:09:36 9924e8Agent*************
2005-06-0212:09:36 9924e8Agent** START **  Agent: Finding updates [CallerId = WindowsUpdate]
2005-06-0212:09:36 9924e8Agent*********
2005-06-0212:09:36 9924e8Agent  * Added update {AC94DB3B-E1A8-4E92-9FD0-E86F355E6A44}.100 to search result
2005-06-0212:09:37 9924e8Agent  * Found 6 updates and 10 categories in search

В современных системах вам потребуется запустить командлет PowerShell. Get-WindowsUpdateLog поскольку журнал больше не хранится в журнале, журнал хранится в etl файлы. Команда скомпилирует WindowsUpdate.log файл со всех etl файлы и сделать его доступным (по умолчанию) в папке рабочего стола текущего пользователя.

Вот описание команды:

В Get-WindowsUpdateLog командлет объединяет и преобразует файлы .etl Центра обновления Windows в один читаемый файл WindowsUpdate.log. Агент обновления Windows использует трассировку событий для Windows (ETW) для создания журналов диагностики. Центр обновления Windows больше не создает файл WindowsUpdate.log напрямую. Вместо этого он создает файлы .etl, которые нельзя сразу прочитать в том виде, в котором они были написаны.

Этот командлет требует доступа к серверу символов Microsoft.


COM API

В COM API - хороший способ получить прямой доступ к Центру обновления Windows без анализа журналов. Приложения этого API варьируются от поиска доступных обновлений на компьютере до установки и удаления обновлений.

Вы можете использовать класс Microsoft.Update.Session для запуска поиска обновлений, а затем подсчитать количество доступных обновлений, чтобы узнать, есть ли какие-либо обновления для компьютера.

Пример PowerShell:

$updateObject = New-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "Serverfault Example Script"
$updateSearcher = $updateObject.CreateUpdateSearcher()
$searchResults = $updateSearcher.Search("IsInstalled=0")
Write-Host $searchResults.Updates.Count

Если возвращаемый результат больше 0, значит для компьютера есть обновления, которые необходимо установить и / или загрузить. Вы можете легко обновить сценарий PowerShell, чтобы он соответствовал вашему приложению.

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


Tl; Dr

Если вы создаете приложение без сценария (скомпилированное) (за исключением PowerShell, у которого есть доступ к COM API), то я бы рекомендовал использовать COM API. В противном случае лучшим вариантом будет анализ журнала.


Ссылки

Как читать файл журнала:
https://support.microsoft.com/en-us/help/902093/how-to-read-the-windowsupdalog-file

Командлет компиляции журнала PowerShell:
https://docs.microsoft.com/en-us/powershell/module/windowsupdate/get-windowsupdatelog?view=win10-ps

Справочник по API Com32:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa387099(v=vs.85).aspx

Microsoft теперь использует значение UBR (Unified Build Revision) для определения уровня исправления. Значение было впервые добавлено в Windows 10

, но теперь обратно в Windows 7

а также Windows 8.1

Итак, запросите значение UBR из HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion и посмотрите на страницу истории обновлений (для Windows 10 v1709 как пример) для значения KB123456 (OS Build 16299.XYZ) слева:

Здесь вы можете видеть, что мой 1709 полностью пропатчен последним обновлением.