Сведения о системе:
Редакция = Windows Server 2019 Standard,
Версия = 1809,
Сборка ОС = 17763.2114
Мой код:
- $UpdateSession = New-Object -ComObject Microsoft.Update.Session
- $UpdateServiceManager = New-Object -ComObject Microsoft.Update.ServiceManager
- $UpdateService = $UpdateServiceManager.AddScanPackageService("Автономная служба синхронизации", $CabPath, 1)
- $UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
- $UpdateSearcher.ServerSelection = 3
- $UpdateSearcher.ServiceID = $UpdateService.ServiceID.ToString()
*ВИСИТ ЗДЕСЬ* - $Missing = $UpdateSearcher.Search("IsInstalled=0")
Сценарий PS отлично работает на нескольких других серверах с 2012 R2, 2016 и 2019; но от этого у меня голова болит. Как только он начинает поиск, -Verbose прекращает вывод (с помощью Set-PSDebug -Trace 2).Этот метод поиска занял от 3 до 15 минут в других системах, но даже через 24 часа он все еще находится на этой строке.
В другом потоке, представленном ниже, я нашел, что может быть решением, но мне нужно знать, как включить функцию поиска в асинхронный режим во время поиска. Или есть другой способ отладить метод этого API? WSUS не мог получать обновления с серверов, а некоторые серверы не распознавались AD или DNS, поэтому я использовал сценарий API WUA для поиска в автономном режиме.
Предыдущий пост от Elliot Labs LLC >>
Я разговаривал с менеджером Microsoft, отвечающим за Центр обновления Windows.
(Дэйв Рот), и он сказал, что вы ни в коем случае не должны пытаться получить
статус Центра обновления Windows через реестр. Он сказал, что вы должны использовать
COM API, чтобы получить статус, выполнив метод поиска и используя
возвращенные результаты для состояния обновления вашего компьютера.
Он также дал мне этот совет:
Как простой FYI, для проверки того, какие обновления установлены, вызывая
IUpdateSearcher::Search с IsInstalled=1 создаст
объект updatecollection, содержащий все установленные обновления. Ты можешь ходить
через него посмотреть, что уже установлено.
Расширяя его совет, вы потенциально можете вызвать этот метод с помощью
IsInstalled=0, чтобы увидеть, какие обновления не установлены. (см.
пример PowerShell ниже).
COM-API
COM API — это хороший способ прямого доступа к Центру обновления Windows без
приходится разбирать логи. Приложения этого API варьируются от поиска
доступные обновления на компьютере для установки и удаления
обновления.
Вы можете использовать класс Microsoft.Update.Session для запуска обновления.
выполните поиск, а затем подсчитайте количество доступных обновлений, чтобы увидеть, есть ли
есть какие-либо обновления для компьютера.
Пример PowerShell:
$updateObject = New-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "Пример сценария сбоя сервера"
$updateSearcher = $updateObject.CreateUpdateSearcher() $searchResults
= $updateSearcher.Search("IsInstalled=0") Write-Host $searchResults.Updates.Count Если возвращаемый результат больше 0
то есть обновления для компьютера, которые нужно установить
и/или скачанный. Вы можете легко обновить сценарий powershell, чтобы он соответствовал
ваше приложение.
Просто напомню, что функция поиска не является асинхронной, поэтому она заморозит ваше приложение во время поиска. В таком случае вы
захочет сделать это асинхронным.