Я хотел бы иметь возможность проверять статус обновления компьютера, запрашивая реестр. Я специально хотел бы, чтобы некоторые проверяли, "полностью ли обновлен" статус обновления компьютера.
Я просмотрел множество записей в реестре, но не смог найти ни одной, которая имеет статус обновления компьютера.
Какие параметры у меня есть, чтобы проверить статус обновления Windows?
Ближайшим к реестру, который я могу найти, является Windows Update log
файл. Единственный другой способ - получить к нему доступ через COM
API.
Я поговорил с менеджером Microsoft, отвечающим за Windows Update
(Дэйв Рот), и он сказал, что вам ни в коем случае не следует пытаться получить статус Центра обновления Windows через реестр. Он сказал, что вам следует использовать COM
API для получения статуса путем выполнения метода поиска и использования возвращенных результатов для статуса обновления вашего компьютера.
Он также дал мне этот совет:
В качестве простой информации, чтобы проверить, какие обновления установлены, позвоните
IUpdateSearcher::Search
с участиемIsInstalled=1
создастupdatecollection
объект, содержащий все установленные обновления. Вы можете пройтись по нему, чтобы увидеть, что уже установлено.
Расширяя его совет, вы потенциально можете вызвать этот метод с помощью IsInstalled=0
чтобы увидеть, какие обновления не установлены. (см. пример PowerShell ниже).
Файл журнала Центра обновления 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 - хороший способ получить прямой доступ к Центру обновления 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, чтобы он соответствовал вашему приложению.
Просто напомню, что функция поиска не является асинхронной, поэтому ваше приложение зависнет во время поиска. В этом случае вы захотите сделать его асинхронным.
Если вы создаете приложение без сценария (скомпилированное) (за исключением 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 полностью пропатчен последним обновлением.