Eu finalmente percebi isso. Há uma API de atualização do Windows (mal) documentada que você pode usar para acionar esses tipos de coisas. Eu usei uma forma modificada do script encontrado aqui que é aproximadamente como perto da documentação como você pode obter.
Eu o modifiquei como abaixo, removendo as partes de download - porque eu controlo o download com o GPO e o WSUS, bem como com todos os prompts. Então eu inseri algum código para reiniciar a caixa, se necessário, pelas atualizações.
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
O próximo passo foi colá-lo junto com o psExec - que não gosta de rodar o VBScripts remotamente. Eu reuni o seguinte arquivo em lote para copiar o script localmente para o servidor e, em seguida, iniciei a instalação com o psExec sendo executado como um usuário do sistema:
for /f %%i in (%1) do copy installUpdates.vbs \%%i\c$
psexec @%1 -s cscript C:\installUpdates.vbs
Tudo o que você precisa neste momento é passar o script em lote de um arquivo de texto com os nomes dos seus computadores - um por linha, e você está pronto para ir. Não é mais necessário fazer login em todos os servidores para iniciar instalações de atualização do Windows!
A única questão que é um pouco irritante é que esta é uma execução muito séria, então se você tiver muitas atualizações, pode demorar um pouco. Não consegui encontrar uma boa maneira de contornar isso, além de dividir sua lista de máquinas e executar várias cópias do arquivo em lote. Não é o fim do mundo.
Um pouco de atualização. Eu descobri que existem algumas instalações que você precisa estar logado interativamente com as permissões adequadas para instalar. Basicamente, se o WSUS diz que não conseguiu instalar você tem que entrar na caixa. Embora este seja um bom passo de ter que entrar em cada caixa.