Tags: System-Management, Software-Distribution, PowerShell, WMI
Möchte man installierte Programme von der Kommandozeile oder via Script entfernen, dann bietet Microsoft dafür gleich mehrere Möglichkeiten. Leider deckt keine Methode alle Szenarien ab. So beschränkt sich etwa das Package-Management nur auf den lokalen Rechner, WMI hingegen erkennt nicht alle Programme.
Bereits bei der Deinstallation von Windows-Komponenten gibt es ein unnötiges Nebeneinander von mehreren Optionen wie Remove-WindowsCapability, Remove-WindowsFeature und Disable-WindowsOptionalFeature. Hinzu kommt noch Remove-WindowsPackage aus dem DISM-Modul.
CLI-Optionen für das Deinstallieren von Anwendungen
Ähnlich inkonsistent sieht es bei den Kommandozeilen-Tools für die Deinstallation von Programmen aus. Vor einigen Jahren führte Microsoft das PowerShell Package Management ein, das primär für das Hinzufügen und Entfernen von PowerShell-Modulen gedacht ist. Es eignet sich aber auch für die Deinstallation von Win32-Programmen.
Im Jahr 2020 kann dann mit dem Paket-Manager winget ein weiteres Tool hinzu, das ein Jahr später die Fähigkeit zum Entfernen von Programmen erhielt. Es hat bis heute aber kein PowerShell-Interface und ist so für die Automatisierung des Paket-Managements nur bedingt geeignet.
Für Store- bzw. UWP-Apps existieren mit Remove-AppxProvisionedPackage und Remove-AppxPackage zudem eigene Cmdlets.
Schließlich besteht noch die Möglichkeit, Anwendungen über WMI zu deinstallieren. Dies ist der einzige der hier genannten Mechanismen, um diese Aufgabe remote zu erledigen.
Programme über WMI deinstallieren
Zuständig ist dafür die Klasse Win32_Product. Mit ihrer Hilfe kann man die installierte Software erst anzeigen:
Get-CimInstance -Class Win32_Product -ComputerName <Remote-PC> |
Format-List
Hat man das fragliche Programm gesichtet, dann kann man die Liste weiter einschränken:
Get-CimInstance -Class Win32_Product -ComputerName <Remote-PC> |
where name -like " PowerShell*"
Schickt man den Output dieses Kommandos durch eine Pipe an Get-Member, dann wird man vergeblich nach einer Uninstall-Methode suchen. Um diese zu bekommen, muss man stattdessen das ältere Get-WMIObject verwenden:
$app = Get-WmiObject -Class Win32_Product -ComputerName <Remote-PC> |
where name -Like "PowerShell*"
Dieser Aufruf würde zum Beispiel eine veraltete Version von PowerShell 7 erfassen und das Resultat an die Variable $app zuweisen.
Anschließend deinstalliert man das Programm mit
$app.uinstall()
Diese Methode funktioniert grundsätzlich gut und eben auch remote. Ihr Nachteil besteht darin, dass sich die installierten Programme über WMI meist nicht vollständig anzeigen lassen.
Tools wie 7-zip tauchen gar nicht auf, andere wieder nur mit einer GUID, so dass man nicht weiß, was sich dahinter verbirgt. In diesem Fall kann man auf das Package-Management ausweichen, das aber nur lokal funktioniert.
Programme mit Uninstall-Package entfernen
Um die installierten Programme aufzulisten, verwendet man das Cmdlet Get-Package. Dieses wirft aber auch Standalone-Updates (msu) oder mit PowerShellGet installierte Module aus. Daher kann man den Output für herkömmliche Win32-Anwendungen so filtern:
Get-Package -ProviderName Programs -IncludeWindowsInstaller
Hat man das betreffende Programm in der Anzeige gefunden, dann spezifiziert man es über den Name-Parameter und übergibt es an Uninstall-Package:
Get-Package -Name "7-zip*" | Uninstall-Package
Get-Package bietet zusätzlich die Möglichkeit, Programme über ihre Versionsnummer zu filtern und wahlweise nur bestimmte (zum Beispiel "RequiredVersion") oder alle Versionen ("AllVersions") zu deinstallieren.
Fazit
Microsoft bietet ein ziemliches Durcheinander an Techniken für das Entfernen von Programmen. Keine davon deckt das gesamte Spektrum an erforderlichen Funktionen ab. Entweder beschränken sie sich auf bestimmte Programmtypen oder sind nicht in der Lage, diese remote zu entfernen.
Letzteres lässt sich über WMI erledigen, wobei man dafür nicht die neuen CIM-Cmdlets verwenden kann. Wenn man auf diesem Weg nur eine unvollständige Liste der installierten Software erhält, dann kann man die Cmdlets aus dem Paket PackageManagement einsetzen - allerdings nur lokal.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- PowerShellGet-Modul aktualisieren, auf PSResourceGet umsteigen
- BitLocker aktivieren mit manage-bde, PowerShell oder WMI
- ScriptRunner Portal Edition R5: Konfiguration von Abfragen, OpenID-Support, Web-API statt IIS
- winget erhält PowerShell-Modul und Configuration Management
- Fehler in geplanten Aufgaben finden mit PowerShell
Weitere Links