Как узнать, сколько обновлений ожидает установки на удаленном сервере?

Есть ли способ узнать, загрузил ли Windows Server (2003, 2008) обновления Microsoft Windows и ждет ли пользователь подтверждения "Установить обновления и перезагрузить сервер"?

Мы используем WSUS и SSCM для сбора и публикации обновлений, и большинство серверов автоматически устанавливаются в воскресенье утром, в основном это сервер разработки и тестирования.

Мы настроили наши важные производственные серверы на установку только вручную, но иногда некоторые серверы не перезагружаются вручную некоторое время (люди забывают!)

Было бы неплохо, если бы был какой-то метод (сценарий powershell, WMI-запрос, некоторая магическая команда), который я мог бы использовать для подсчета или обнаружения там, где ожидают обновления.

5 ответов

Решение

Вот сценарий, который я написал. Он скажет вам:

  • Сколько патчей ожидает установки
  • Если патчи потребуют перезагрузки
  • Если сервер в настоящее время ожидает перезагрузки, чтобы включить исправления

Пример использования: C:\> cscript ServerPendingUpdates.vbs myserver01 myserver02

Connecting to myserver01 to check software update status...
myserver01 has 2 updates pending installation
myserver01 WILL need to be rebooted to complete the installation of these updates.
myserver01 is waiting for a REBOOT to complete a previous installation.

<snip>

Автор сценария:

'#
'# ServerPendingUpdates.vbs
'#
'# Usage: cscript ServerPendingUpdates.vbs {servername} {servername} {servername} {servername}
'#    If no {servername} specified then 'localhost' assumed
'#
'# To do: Error handling
'#
Option Explicit
Dim strServer        : strServer         =  GetArgValue(0,"localhost")


'#
'# Loop through the input parameters for each server
'#
Dim i
For i = 0 To WScript.Arguments.Count - 1
    CheckServerUpdateStatus GetArgValue(i,"localhost") 'strServer
Next

WScript.Quit(0)

Function CheckServerUpdateStatus( ByVal strServer )

    WScript.Echo vbCRLF & "Connecting to " & strServer & " to check software update status..."

    Dim blnRebootRequired    : blnRebootRequired     = False
    Dim blnRebootPending    : blnRebootPending     = False
    Dim objSession        : Set objSession    = CreateObject("Microsoft.Update.Session", strServer)
    Dim objUpdateSearcher     : Set objUpdateSearcher    = objSession.CreateUpdateSearcher
    Dim objSearchResult    : Set objSearchResult     = objUpdateSearcher.Search(" IsAssigned=1 and IsHidden=0 and Type='Software'")

    '#
    '#
    '#
    Dim i, objUpdate
    Dim intPendingInstalls    : intPendingInstalls     = 0

    For i = 0 To objSearchResult.Updates.Count-1
        Set objUpdate = objSearchResult.Updates.Item(I) 

        If objUpdate.IsInstalled Then
            If objUpdate.RebootRequired Then
                blnRebootPending     = True
            End If
        Else
            intPendingInstalls    = intPendingInstalls + 1
            'If objUpdate.RebootRequired Then    '### This property is FALSE before installation and only set to TRUE after installation to indicate that this patch forced a reboot.
            If objUpdate.InstallationBehavior.RebootBehavior <> 0 Then
                '# http://msdn.microsoft.com/en-us/library/aa386064%28v=VS.85%29.aspx
                '# InstallationBehavior.RebootBehavior = 0    Never reboot
                '# InstallationBehavior.RebootBehavior = 1    Must reboot
                '# InstallationBehavior.RebootBehavior = 2    Can request reboot
                blnRebootRequired     = True
            End If

        End If
    Next

    WScript.Echo strServer & " has " & intPendingInstalls & " updates pending installation"

    If blnRebootRequired Then
        WScript.Echo strServer & " WILL need to be rebooted to complete the installation of these updates."
    Else
        WScript.Echo strServer & " WILL NOT require a reboot to install these updates."
    End If


    '#
    '#
    '#
    If blnRebootPending Then
        WScript.Echo strServer & " is waiting for a REBOOT to complete a previous installation."
    End If 
End Function



'#
'#
'#
Function GetArgValue( intArgItem, strDefault )
    If WScript.Arguments.Count > intArgItem Then
        GetArgValue = WScript.Arguments.Item(intArgItem)
    Else
        GetArgValue = strDefault
    End If
End Function

Как администратор удаленного окна, откройте MMC, а затем добавьте оснастку "Просмотр событий". Выберите "Другой компьютер" (вместо значения по умолчанию "Локальный компьютер" и введите имя целевого компьютера. Затем отфильтруйте по типу события, чтобы увидеть только те, которые вам нужны! Он называется "Агент обновления Windows", и описание начнется с

"Установка готова: следующие обновления загружены и готовы к установке. В настоящее время на компьютере запланировано установить эти обновления [дата]..."

Вы можете использовать http://wuinstall.com/. У него есть ключ / search, чтобы увидеть, ожидают ли обновления. Вы можете выполнить удаленно с psexec.

Другой вариант - проанализировать%windir%\windowsupdate.log и найти что-то вроде этого: # ПРЕДУПРЕЖДЕНИЕ: установка вызова завершена, требуется перезагрузка = да, ошибка = 0x00000000

Я использую скрипт UpdateHf.vbs, созданный Робом Данном и участниками. Поскольку он запускается локально на хосте, о котором он сообщает, он установлен на всех моих машинах. Я создал пакет MSI и протолкнул его через GPO.

Для запуска отчетов у меня есть коллекция сценариев PowerShell, которые создают запланированные задачи на серверах OU, где каждый компьютер должен запускать UpdateHF.vbs локально и отправлять мне результаты по электронной почте. Затем я использую правила сортировки для цветовой кодировки получаемых писем на основе поиска отличительного текста в отчете.

UpdateHF.vbs - это, по сути, оболочка для опубликованного API автоматического обновления Microsoft, поэтому, поспорив, вы могли бы выяснить, какой бит сценария обрабатывает проверку "Reboot Pending", если вам нужен только логический флаг состояния перезагрузки.

Вот ядро ​​моей системы: Powershell заполняет переменные при вызове schtasks.exe. (Обратите внимание, что если пароль содержит сложные символы, вам нужно экранировать их с помощью обратного кавычка.)

schtasks.exe /create /F /S $TargetHost /tn Patch /sc once /st $TargetTime /sd $StartDate /ru User /rp Password /tr "$WinPath\system32\cscript.exe $WinPath\UpdateHF.vbs $UpdateArgs"

В 2012 R2 сервер перейдите в Панель управления, нажмите на Обновления Windows. На левой панели страницы нажмите на ссылку "Проверить наличие обновлений", вы увидите список ожидающих обновлений (которые еще не установлены на сервере). Нажмите на любую ссылку, которую вы получите, чтобы увидеть полный (необязательный и обязательный) список с кратким описанием для каждого из них.

Обратите внимание, что для этой автоматической установки обновления должны быть включены.

Другие вопросы по тегам