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

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

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

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

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

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

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

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

Пример использования: 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», и описание будет начинаться с

«Готово к установке: следующие обновления загружены и готовы к установке. На этом компьютере в настоящее время запланирована установка этих обновлений на [дата] ...»

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

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

UpdateHF.vbs - это, по сути, оболочка для опубликованного Microsoft API автоматического обновления, поэтому, покопавшись, я уверен, вы могли бы выяснить, какой бит скрипта обрабатывает проверку «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"

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

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

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

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