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

Удаленный запуск установки обновления, загруженного WSUS

Это меня уже давно беспокоит. У нас есть серверы, настроенные на загрузку только обновлений Windows, чтобы они были установлены во время одного из наших окон обновлений, выходящих раз в два месяца. В течение этого времени я тщательно искал способ запустить установку удаленно на серверах, чтобы мне не приходилось входить на сотню или более серверов и нажимать на всплывающее окно «Установить обновления сейчас».

Кто-нибудь знает способ удаленно запускать установку обновлений?

Я наконец-то понял. Существует (едва) документированный API обновления Windows, который можно использовать для запуска подобных действий. Я использовал измененную форму найденного скрипта Вот что максимально близко к документации.

Я изменил его, как показано ниже, убрав части загрузки, потому что я контролирую загрузку с помощью GPO и WSUS, а также всеми подсказками. Затем я вставил код для перезагрузки коробки, если это необходимо для обновлений.

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software'")


WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If


Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update) 
    End If
Next

'WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
'strInput = WScript.StdIn.Readline
'WScript.Echo 

'If (strInput = "N" or strInput = "n") Then 
'   WScript.Quit
'ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()

    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    If (installationResult.RebootRequired = True) Then
        Set RebootShell = WScript.CreateObject("Wscript.Shell")
        RebootShell.Run "shutdown.exe -r -t 0"
    End If

    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
     "and individual installation results:" 

    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode         
    Next
'End If

Следующим шагом было склеить это вместе с psExec, который не любит запускать VBScripts удаленно. Я собрал следующий командный файл, чтобы скопировать сценарий локально на сервер, а затем начал установку, запустив psExec как системный пользователь:

for /f %%i in (%1) do copy installUpdates.vbs \\%%i\c$
psexec @%1 -s cscript C:\installUpdates.vbs

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

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


Небольшое обновление. Я обнаружил, что есть некоторые установки, в которых вам просто нужно интерактивно войти в систему с соответствующими разрешениями для установки. в основном, если wsus говорит, что не удалось установить, вам нужно заняться коробкой. Хотя это хороший шаг вперед от необходимости входить в КАЖДОЕ поле.

Использовать объект групповой политики, чтобы настроить их автоматическую установку в сроки, указанные в вашем окне, а затем просто не утверждать какие-либо обновления раньше, чем за несколько часов до того, как развернутся ваши двухмесячные окна?

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

Если вы хотите запускать не последовательно, просто добавьте -d в командную строку PSEXEC. Затем он запустит installupdates.vbs в неинтерактивном режиме.

Есть также WuInstall. Бесплатная версия кажется не лучше, чем сценарий API WUA, который вы собрали, но профессиональная версия имеет возможность автоматически принимать eula, что, как я полагаю, является причиной большинства необходимых интерактивных обновлений.