Ich habe es endlich herausgefunden. Es gibt eine (kaum) dokumentierte Windows Update-API, mit der Sie diese Art von Dingen auslösen können. Ich habe eine modifizierte Form des hier gefundenen Skripts verwendet, die der Dokumentation so nahe wie möglich kommt.
Ich habe es wie folgt geändert und die Download-Teile herausgenommen - weil ich den Download mit GPO und WSUS sowie allen Eingabeaufforderungen steuere. Dann habe ich einen Code eingefügt, um die Box neu zu starten, falls dies für die Updates erforderlich ist.
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
Der nächste Schritt bestand darin, dies mit psExec zusammenzukleben - was es nicht mag, VBScripts remote auszuführen. Ich habe die folgende Batchdatei zusammengestellt, um das Skript lokal auf den Server zu kopieren, und dann die Installation mit psExec gestartet, das als Systembenutzer ausgeführt wird:
for /f %%i in (%1) do copy installUpdates.vbs \\%%i\c$
psexec @%1 -s cscript C:\installUpdates.vbs
An dieser Stelle müssen Sie dem Batch-Skript lediglich eine Textdatei mit den Namen Ihrer Computer übergeben - eine pro Zeile, und schon kann es losgehen. Sie müssen sich nicht mehr bei jedem Server anmelden, um Windows Update-Installationen zu starten!
Das einzige Problem, das ein wenig ärgerlich ist, ist, dass dies eine serielle Ausführung ist. Wenn Sie also viele Updates haben, kann dies eine Weile dauern. Ich konnte keinen guten Weg finden, um dies zu umgehen, außer Ihre Maschinenliste aufzubrechen und mehrere Kopien der Batch-Datei auszuführen. Nicht das Ende der Welt.
Ein kleines Update. Ich habe herausgefunden, dass es einige Installationen gibt, bei denen Sie nur interaktiv mit den richtigen Installationsberechtigungen angemeldet sein müssen. Wenn wsus sagt, dass die Installation fehlgeschlagen ist, müssen Sie sich auf die Box begeben. Obwohl dies ein schöner Schritt ist, nachdem Sie sich in JEDER Box anmelden müssen.