Это меня уже давно беспокоит. У нас есть серверы, настроенные на загрузку только обновлений 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, что, как я полагаю, является причиной большинства необходимых интерактивных обновлений.