Automatisch aufgebessert

Teil 4: Windows-Update im Eigenbau

Entwicklung und Tests der Skripte nahmen mehrere Monate in Anspruch. Bevor Sie das erste Skript check_1.vbs starten, vergewissern Sie sich, dass Sie die im Artikel erwähnten Voraussetzungen erfüllt haben.

  • Windows XP/ SP2 plus Version von wuaueng.dll größer oder gleich 5.4.3790.1000
  • Der Windows Script Host (WSH) kann auf vbs-Skripte zugreifen.
  • Der PC ist mit dem Internet verbunden.
Windows-Update im Eigenbau

© Archiv

Hartnäckig: Nach ausgedehnten Deinstallationen und Neuinstallation von Updates war dieser Fehler im Skript check_1.vbs endlich beseitigt.

Trotzdem meldete ein PC bei Tests beim Start schon des ersten Skripts check_1.vbs den Fehler 80072F8F. Dies kann bedeuten, dass eine Firewall den Internet-Zugriff für den Update-Download aushebelt. Weiterhin stand ein Microsoft .NET Framework 2.0 in Verdacht, diesen Fehler zu verursachen.

Weitere Tests ergaben, dass nach dessen Deinstallation und einer Neuinstallation der bisherigen Updates die Datei check_1.vbs ihre Aufgabe erfüllen konnte. Danach arbeiten auch die Install-Skripte. Weil diese keine Benutzerführung haben können, rufen Sie diese besser erst auf, wenn Sie die Updates automatisch installieren wollen.

Download und Installation

Das Skript in down_1.vbs liest zunächst die Update-Ids aus der Textdatei updates.txt ein. Um eine Verbindung zur Datei herzustellen, benötigen Sie ein FileSystemObject. Für dieses rufen Sie dann die Methode OpenTextFile() auf. Den Namen der Textdatei übergeben Sie dabei als String. Mit dem Wert 1 für den zweiten Parameter öffnen Sie die Datei im Lesemodus. Den Rückgabewert speichern Sie in der Variablen lese. Mit dieser lesen Sie den Inhalt von updates.txt zeilenweise aus und speichern ihn im Array arr().

Windows-Update im Eigenbau

© Archiv

Geschmacksache: Die WGA-Gültigkeitsprüfung muss man mögen ? oder auch nicht.
Set fso = CreateObject("Scripting.File 
SystemObject") 
Set lese = 
fso.OpenTextFile("updateids.txt", 1) 
dim arr() 
i = 0 
Do While lese.AtEndOfStream True 
redim preserve arr(i) 
arr(i) = lese.ReadLine() 
i = i + 1 
Loop

Im weiteren Verlauf laden Sie die Updates vom Server, ohne sie jedoch zu installieren. Dafür benötigen Sie im Code ein Update- Downloader-Objekt und eine UpdateCollection. In der For-Schleife fügen Sie schließlich die Updates nacheinander mit der Add()-Methode Ihrer UpdateCollection hinzu.

Windows-Update im Eigenbau

© Archiv

Erfolg im Detail: Das Skript kann auch auf den ResultCode jedes einzelnen Updates reagieren.
Set downloader = 
updateSession.CreateUpdateDownloader() 
Set updatesToDownload = 
CreateObject("Microsoft.Update.UpdateCo 
ll") 
For k = 0 To UBound(arr) 
... 
updatesToDownload.Add(update) 
Next

Beachten Sie, dass Sie der Search()-Methode die jeweilige UpdateID als Zeichenkette in der Form UpdateID="12345678-9abc-defg-1234-56789abcdefg" übergeben müssen. Verzichten Sie vor und nach dem = (Gleichzeichen) auf Leerzeichen.

s = "UpdateID=?" & arr(k) & "?" 
Set searchResult = 
updateSearcher.Search(s)

Sie können den zusammengesetzten String auch direkt übergeben, ohne ihn in der Variablen zwischenzuspeichern Set searchResult = updateSearcher.Search("UpdateID=?" & arr(k) & "?"). Per Default werden die Updates im Unterverzeichnis SoftwareDistributionDownload Ihrer Windows-Installation abgelegt, also etwa in C:WindowsSoftwareDistributionDownload. Insofern Sie einen anderen Ort festlegen wollen, können Sie im Code die Methode CopyFromCache() mit dem gewünschten Pfad als String-Parameter verwenden.Eine genaue Beschreibung dieser Methode finden Sie im Interface IUpdate in der MSDN-Library. Natürlich steht es Ihnen frei, updates.txt mit einem der check-Skripte zu versorgen oder die IDs der gewünschten Updates selbst einzutragen oder die anderen zu löschen.

Um ein Update manuell zu installieren, starten Sie im Unterordner Update die Datei update.exe oder hotfix.exe. Zwar erfolgt die Versionskontrolle automatisch, doch nur wenn kein Versionskonflikt vorliegt, installiert sich die Software. Dennoch ist es empfehlenswert, die Updates nach ihrem Erscheinungsdatum, das Sie der Infodatei (updatesinfo.txt) entnehmen können, zu installieren. Das Skript down_2.vbs führt die Anweisung updatesToDownload.Add(update) aus, wenn bei dem Update das Wort Genuine nicht im Titel vorkommt, wovon das Windows-Genuine-Advantage-Gültigkeitsprüfungs- und das Windows-Genuine-Advantage-Notification-Tool betroffen sind. Damit schließen Sie diese beiden vom Download aus.

Windows-Update im Eigenbau

© Archiv

Erfolg im Ganzen: Das Skript install_2.vbs hat alle Updates installiert.
If Instr(update.Title, "Genuine") = 0 
Then 
updatesToDownload.Add(update) 
End If

Es sei angemerkt, dass sich über das Skript auch solche Updates problemlos downloaden und installieren ließen, die auf der Windows- Update-Seite oder im Microsoft Download Center zwingend die WGA-Prüfung erforderten. Mit dem Suchkriterium Genuine im Titel dürfte sich das Skript im Übrigen auch als Vista-tauglich erweisen.Möchten Sie für den Fall vorsorgen, dass Microsoft einmal beginnt, genuine klein zu schreiben? Dann wandeln Sie Update-Titel und Genuine vor dem Vergleich mit der Funktion LCase() in Klein- bzw. mit UCase() in Großbuchstaben um: Instr(LCase(update.Title), LCase("Genuine")).

Das Beispiel install_1.vbs erweitert das Skript um die Installation. Dafür benötigen Sie im Code eine zusätzliche UpdateCollection. Dieser fügen Sie die Updates wiederum mit der Add()-Methode hinzu - ebenfalls unter der Bedingung, dass Genuine nicht im Titel enthalten ist. Schließlich instanzieren Sie ein UpdateInstaller-Objekt. Sie verwenden es für die Installation in gleicher Weise wie beim Download den UpdateDownloader.

Set installer = 
updateSession.CreateUpdateInstaller() 
installer.Updates = updatesToInstall 
installer.Install()

Im Ergebnis speichert install_1.vbs die Updates und installiert sie, wobei das Genuine-Advantage- und das Notification-Tool außen vor bleiben. Das Skript install_2.vbs teilt darüber hinaus den Installationserfolg mit. Dazu ist es notwendig, im Code den Rückgabewert der Install()-Methode - ein UpdateInstallationResult-Objekt - festzuhalten: Set installationResult = installer.Install(). Dieses besitzt die Eigenschaft ResultCode. Deren Rückgabewert 2 zeigt die erfolgreiche Installation an, der Wert 4, dass während der Installation Fehler aufgetreten sind. Außerdem kämpfen Sie noch mit den Werten

  • 0: the operation is not started,
  • 1: the operation is in progress,
  • 3: the operation failed to complete sowie mit dem Wert
  • 5: the operation is aborted

Zumindest die letzten drei Werte dürften für das vorliegende Skript weniger bedeutsam sein. Natürlich steht es Ihnen frei, die Meldungen auf der Basis dieser Informationen detailliert zu spezifizieren. Mit der Methode GetUpdateResult() können Sie überdies für jedes einzelne Update den Installationserfolg mit wenigen Skriptzeilen selbst prüfen.

Mehr zum Thema

festplatte, hardware, pc, hdd
Gelöschte Dateien wiederherstellen

Wir zeigen Ihnen, wie Sie verloren geglaubte Daten retten können - etwa mit dem kostenlosen Tool Recuva.
image.jpg
Windows 7 und 8

Wer Windows 7 oder 8 im langsameren IDE-Modus installiert hat, kann seine Festplatte mit Tricks nachträglich auf den AHCI-Modus umstellen.
Daten löschen - Datenmüll (Symbolbild)
Temp-Ordner

Die Datenträgerbereinigung von Windows 7/8/10 entfernt nicht allen Datenmüll. So können Sie die Dateien im Temp-Ordner selbst löschen.
Windows Energieeinstellungen optimieren
Die besten Tipps

Die Energieeinstellungen in Windows lassen sich flexibel anpassen. Wir zeigen Ihnen, wie Sie Ihren eigenen Energiesparplan optimieren.
Windows 10 - Erste Schritte
Startmenü, Edge & Co.

Zum Ende der Gratis-Update-Phase von Windows 10 gibt es noch einmal einen Schwung neuer Nutzer. Wir führen durch Funktionen, Apps und Einstellungen.