Kleine Tipps für Zwischendurch (Teil 12) – Anwendungen deinstallieren mit der PowerShell

Dieser Tipp ist im Grunde nichts Besonderes, aber es ist trotzdem nach wie vor beeindruckend wie einfach sich eine Anwendung über die Uninstall-Methode der Win32_Product-Klasse deinstallieren lässt:

$P =  get-wmiobject Win32_Product | where { $_.Name -eq „Camtasia Studio 6“}
$P.Uninstall()

Ging alles gut, lautet der ReturnValue-Wert 0, ansonsten z.B. 1603, was auf einen allgemeinen Fehler (eventuell fehlende Berechtigungen, wenn die PowerShell nicht im Adminmodus läuft) hindeutet.

Die Windows PowerShell läuft bekanntlich als Update (z.B. KB928439) und wird daher weder von Win32_Product noch von Win32_QuickFixEngineering aufgelistet.  Für Updates ist die COM-Komponente Microsoft.Update.Searcher zuständig:

$Wu  = new-object -com Microsoft.Update.Searcher

Über GetTotalHistoryCount() holt man sich die Anzahl der Updates:

$Anzahl = $Wu.GetTotalHistoryCount()

und kann anschließend mit dieser Zahl z.B. die PowerShell lokalisieren:

$Wu.QueryHistory(0, $Anzahl) | where-object { $_.Description -like „*powerShell*“} | gm

Noch ausführlichere Informationen erhält man über eine Suche, z.B. nach den Updates:

$Wu.Search(„Type=’Software'“).Updates | where { $_.Title.Contains(„PowerShell“)}

Eine recht ausführliche Beschreibung (allerdings noch für den Windows Scripting Host) gibt es hier.

Deinstallieren lässt sich ein Update theoretisch auch – über die COM-Komponente Microsoft.Update.Installer.

Das werde ich bei der PowerShell 1.0 jetzt „zu Fuss“ vornehmen, da ich heute auf die PowerShell 2.0 umstelle, auch wenn leider immer noch die CTP 3 von Weihnachten zur Verfügung steht (mich würde interessieren, welche Version in der Beta von Windows 7 enthalten ist) – aber wie heißt es so schön – beta late, then never.

PS: Theoretisch ließe sich die PowerShell – wie jedes andere Update – auch per Skript deinstallieren, doch wie es bereits Scripting-Guy Ed Wilson und Craig Liebendorfer in einer „Hey, Scripting Guy“-Kolumne beschrieben haben, scheint generell der Aufruf von Uninstall() aus irgendeinem Grund nicht zu funktionieren. Das folgende Skript sollte funktionieren, tut es aber nicht. Es lokalisiert zunächst das PowerShell-Update (für Vista) und ruft an über das Installer-Objekt die zuständige Uninstall-Methode auf:

# ————————————————————-
# PowerShell 1.0 deinstallieren – KB928439
# ————————————————————-
$UpdateCollection = new-object -com Microsoft.Update.UpdateColl
$Searcher = new-object -com Microsoft.Update.Searcher
$UpdateID = „317fc20d-c099-41d4-8bf2-2dff49af911a“
#$Result = $Searcher.Search(„UpdateID=’$UpdateID'“)
$Result = $Searcher.Search(„Type=’Software'“)
$WSUpdate = $Result.Updates | Where-Object { $_.KBArticleIDs -eq „928439“}
# Ab hier geht es nicht mehr
$UpdateCollection.Add($WSUpdate)
$Installer = new-object -com Microsoft.Update.Installer
$Installer.Updates = $UpdateCollection
$Installer.UnInstall()
if ($?)
{ write-host -fore green „PowerShell 1.0 wurde tatsächlich deinstalliert“ }
else
{ write-host -fore yellow „Es gab ein Problem…“ }

Beim Aufruf von Uninstall() kommt es leider zu einer COM-Fehlermeldung (z.B. 1063). Vielleicht hat ein Leser dieses Blog-Eintrags eine Idee?

Schreibe einen Kommentar

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s