Aktionen

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



Loading comments...