Windows Update per Skript suchen herunterladen installieren reboot
Aus znilwiki
Ein Kunde hatte auf die schnelle ein Script gebraucht das auf einigen Windows-Rechner mit manuellen Windows-Updates eben diese einspielt.
Fündig wurde ich unter
https://docs.microsoft.com/de-de/windows/desktop/Wua_Sdk/searching--downloading--and-installing-updates
Da ist ein schönes VB-Script was all die Anforderungen erfüllt.
Ich habe es so angepasst das es automatisch durchläuft (inklusive reboot), gestartet wird es über eine Batchdatei.
Angepasstes Skript
Das Original findet Ihr unter
https://docs.microsoft.com/de-de/windows/desktop/Wua_Sdk/searching--downloading--and-installing-updates
Das Skript heißt
WindowsUpdate.vbs
Set updateSession = CreateObject("Microsoft.Update.Session")
updateSession.ClientApplicationID = "MSDN Sample Script"
Set updateSearcher = updateSession.CreateUpdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF
Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")
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
WScript.Echo vbCRLF & "Creating collection of updates to download:"
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
For I = 0 to searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)
addThisUpdate = false
If update.InstallationBehavior.CanRequestUserInput = true Then
WScript.Echo I + 1 & "> skipping: " & update.Title & _
" because it requires user input"
Else
If update.EulaAccepted = false Then
WScript.Echo I + 1 & "> note: " & update.Title & _
" has a license agreement that must be accepted:"
WScript.Echo update.EulaText
WScript.Echo "Do you accept this license agreement? (Y/N)"
' Abfrage wird übersprungen und Wert manuell gesetzt
'strInput = WScript.StdIn.Readline
strInput = "Y"
WScript.Echo
If (strInput = "Y" or strInput = "y") Then
update.AcceptEula()
addThisUpdate = true
Else
WScript.Echo I + 1 & "> skipping: " & update.Title & _
" because the license agreement was declined"
End If
Else
addThisUpdate = true
End If
End If
If addThisUpdate = true Then
WScript.Echo I + 1 & "> adding: " & update.Title
updatesToDownload.Add(update)
End If
Next
If updatesToDownload.Count = 0 Then
WScript.Echo "All applicable updates were skipped."
WScript.Quit
End If
WScript.Echo vbCRLF & "Downloading updates..."
Set downloader = updateSession.CreateUpdateDownloader()
downloader.Updates = updatesToDownload
downloader.Download()
Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
rebootMayBeRequired = false
WScript.Echo vbCRLF & "Successfully downloaded updates:"
For I = 0 To searchResult.Updates.Count-1
set update = searchResult.Updates.Item(I)
If update.IsDownloaded = true Then
WScript.Echo I + 1 & "> " & update.Title
updatesToInstall.Add(update)
If update.InstallationBehavior.RebootBehavior > 0 Then
rebootMayBeRequired = true
End If
End If
Next
If updatesToInstall.Count = 0 Then
WScript.Echo "No updates were successfully downloaded."
WScript.Quit
End If
If rebootMayBeRequired = true Then
WScript.Echo vbCRLF & "These updates may require a reboot."
End If
WScript.Echo vbCRLF & "Would you like to install updates now? (Y/N)"
' Abfrage wird übersprungen und Wert manuell gesetzt
'strInput = WScript.StdIn.Readline
strInput = "Y"
WScript.Echo
If (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
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
'Reboot ergänzt!
If rebootMayBeRequired = true Then
WScript.Echo vbCRLF & "Start Reboot ..."
Set WSHShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\WINDOWS\system32\shutdown.exe -r -t 120"
End If
Ich habe alle Nachfragen nach Y/N auskommentiert und die Variable manuell auf Y gesetzt.
Außerdem habe ich am Ende den Reboot angehängt.
Den Reboot könnte man manuell noch mit
shutdown /a
abbrechen.
Ausführen
Wenn Ihr das WindowsUpdate.vbs
per Doppelklick startet wird es mit wscript.exe
geöffnet und produziert Popup-Fenster.
Es ist dafür gedacht über cscript.exe
gestartet zu werden.
c:\Windows\System32\cscript.exe WindowsUpdate.vbs
Nachfolgend ein kleines Skript was ich zusammen mit dem VBS-Skript einfach in einer Freigabe hinterlegt habe.
Das Skript heißt
WindowsUpdate.cmd
und hat folgenden Inhalt:
@echo off
start c:\Windows\System32\cscript.exe \\SERVER\FREIGABE\ORDNER\WindowsUpdate.vbs