Anwendungen, die für die Verwendung von Windows Installer entwickelt wurden, können über die Win32_Product-WMI-Klasse aufgerufen werden. Windows Installer wird jedoch nicht von allen aktuellen Anwendungen verwendet. Windows Installer bietet die größte Bandbreite im Hinblick auf Standardtechniken für Installationsanwendungen, sodass diese hier schwerpunktmäßig behandelt werden sollen. Anwendungen mit anderen Installationsroutinen werden i. d. R. nicht von Windows Installer verwaltet. Bestimmte Techniken für das Arbeiten mit diesen Anwendungen sind von der verwendeten Installationssoftware sowie Entscheidungen der Anwendungsentwickler abhängig.

Hinweis:

Anwendungen, die durch Kopieren der Anwendungsdateien auf den Computer installiert werden, können mit den hier besprochenen Verfahren nicht verwaltet werden. Sie können diese Anwendungen als Dateien und Ordner mit den im Abschnitt "Arbeiten mit Dateien und Ordnern" behandelten Techniken verwalten.

Auflisten von Windows Installer-Anwendungen

Um die mit Windows Installer in einem lokalen oder Remotesystem installierten Anwendungen aufzuführen, verwenden Sie die folgende einfache WMI-Abfrage:

PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0

Um alle Eigenschaften des Win32_Product-Objekts anzuzeigen, verwenden Sie den Properties-Parameter der Formatierungs-Cmdlets, z. B. das Cmdlet "Format-List", mit dem Wert "*" (alle).

PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property *
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation

Sie können auch nur Microsoft .NET Framework 2.0 auswählen, indem Sie den Get-WmiObject Filter-Parameter verwenden. Da es sich bei dem in diesem Befehl verwendeten Filter um einen WMI-Filter handelt, wird die WQL-Syntax (WMI Query Language), nicht die Windows PowerShell-Syntax verwendet. Stattdessen:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *

In WQL-Abfragen werden häufig bestimmte Zeichen, z. B. Leerzeichen oder Gleichheitszeichen, verwendet, die in Windows PowerShell eine besondere Bedeutung besitzen. Der Wert des Filter-Parameters sollte daher vorsichtshalber immer in Anführungszeichen eingeschlossen werden. Sie können auch das Escapezeichen von Windows PowerShell verwenden, d. h. das Graviszeichen (`); dadurch wird die Lesbarkeit jedoch möglicherweise beeinträchtigt. Der folgende Befehl entspricht dem vorangegangenen und gibt die gleichen Ergebnisse zurück. Hier wird jedoch ein Graviszeichen verwendet, um Sonderzeichen zu überspringen, anstatt die gesamte Filterzeichenfolge in Anführungszeichen einzuschließen:

Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *

Wenn Sie nur die Eigenschaften aufführen möchten, die Sie interessieren, verwenden Sie den Property-Parameter der Formatierungs-Cmdlets.

Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...

Um letztlich nur die Namen installierter Anwendungen zu suchen, können Sie mit einer einfachen Format-Wide-Anweisung die Ausgabe vereinfachen:

Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1

Sie haben nun mehrere Möglichkeiten kennengelernt, Anwendungen aufzulisten, die mit Windows Installer installiert werden. Dabei wurde jedoch noch nicht auf andere Anwendungen eingegangen. Da die Standardanwendungen i. d. R. eine Registrierung des Deinstallationsprogramms unter Windows vornehmen, können diese in der Windows-Registrierung gesucht und lokal bearbeitet werden.

Auflisten aller deinstallierbaren Programme

Eine hundertprozentige Sicherheit, alle Anwendungen auf einem System zu finden, besteht nicht. Es ist jedoch möglich, alle Programme zu finden, die im Dialogfeld "Software" aufgeführt sind. In der Systemsteuerungsoption "Software" finden Sie diese Anwendungen unter dem folgenden Registrierungsschlüssel:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

Die Anwendungen können auch über diesen Schlüssel gesucht werden. Um das Anzeigen des Uninstall-Schlüssels zu vereinfachen, kann einem Registrierungsspeicherort ein Windows PowerShell-Laufwerk zugeordnet werden:

PS>    

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
Hinweis:

Das Laufwerk HKLM: ist dem Stamm von HKEY_LOCAL_MACHINE zugeordnet ist, daher wurde dieses Laufwerk im Pfad des Uninstall-Schlüssels verwendet. Statt HKLM: kann der Registrierungspfad auch mit HKLM oder HKEY_LOCAL_MACHINE angegeben werden. Vorhandene Registrierungslaufwerke haben den Vorteil, dass die Schlüsselnamen mithilfe der Tab-Vervollständigung eingegeben werden können und keine manuelle Eingabe erforderlich ist.

Sie verfügen nun über das Laufwerk "Uninstall", das zum schnellen und einfachen Suchen von Anwendungsinstallationen verwendet werden kann. Die Anzahl der installierten Anwendungen kann anhand der Registrierungsschlüssel im Verzeichnis "Uninstall:" von Windows PowerShell bestimmt werden:

PS> (Get-ChildItem -Path Uninstall:).Count
459

Die Liste der Anwendungen kann auf verschiedene Weise weiter durchsucht werden, z. B. mit Get-ChildItem. Wenn Sie eine Liste von Anwendungen abrufen und diese in der Variablen $UninstallableApplications speichern möchten, verwenden Sie den folgenden Befehl:

$UninstallableApplications = Get-ChildItem -Path Uninstall:
Hinweis:

Aus Gründen der Übersichtlichkeit wird an dieser Stelle ein langer Variablenname verwendet. Tatsächlich gibt es keinen Grund für eine Verwendung langer Dateinamen. Die Tab-Vervollständigung kann zwar für Variablennamen nicht verwendet werden, Zeichennamen aus 1 bis 2 Buchstaben sind jedoch ausreichend. Lange, beschreibende Namen empfehlen sich besonders bei der Entwicklung von Code, der zu einem späteren Zeitpunkt wiederverwendet werden soll.

Um die Werte der Registrierungseinträge in den Registrierungsschlüsseln unter "Uninstall" anzuzeigen, verwenden Sie die GetValue-Methode der Registrierungsschlüssel. Als Wert der Methode wird der Name des Registrierungseintrags verwendet.

Beispielsweise können die Anzeigenamen von Anwendungen im Uninstall-Schlüssel mit folgendem Befehl bestimmt werden:

PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }

Es gibt keine Garantie dafür, dass diese Werte eindeutig sind. Im folgenden Beispiel werden zwei installierte Elemente als "Windows Media Encoder 9 Series" angezeigt:

PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}


   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...

Installieren von Anwendungen

Windows Installer-Pakete können mit der Win32_Product-Klasse remote oder lokal installiert werden. Bei Remoteinstallationen verwenden Sie einen UNC (Universal Naming Convention)-Netzwerkpfad zum MSI-Paket, da Windows PowerShell-Pfade vom WMI-Subsystem nicht verarbeitet werden können. Geben Sie beispielsweise an der Eingabeaufforderung von Windows PowerShell den folgenden Befehl ein, um das Paket "NewPackage.msi" in der Netzwerkfreigabe "\\AppServ\dsp" auf dem Remotecomputer "PC01" zu installieren.

(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)

Anwendungen, die nicht die Windows Installer-Technologie verwenden, verfügen möglicherweise über spezifische Methoden zur automatischen Bereitstellung. Dies können Sie in der Dokumentation der Anwendung feststellen oder sich an den Kundensupport des jeweiligen Anbieters wenden. In einigen Fällen verfügt der Hersteller der Installationssoftware möglicherweise über Automatisierungstechniken, auch wenn eine Anwendung vonseiten des Anbieters dafür nicht unbedingt vorgesehen war.

Entfernen von Anwendungen

Das Entfernen eines Windows Installer-Pakets mit Windows PowerShell erfolgt analog zur Installation eines Pakets. Im nachfolgenden Beispiel wird das Paket, das deinstalliert werden soll, anhand des Namens ausgewählt. Das Filtern anhand der IdentifyingNumber kann in einigen Fällen jedoch einfacher sein:

(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()

Unabhängig davon, ob dieser Vorgang lokal oder remote vorgenommen wird, erfordert das Entfernen anderer Anwendungen etwas mehr Aufwand. Die Deinstallationszeichenfolgen für die Befehlszeile werden durch Extrahieren der UninstallString-Eigenschaft bestimmt. Diese Methode kann für Windows Installer-Anwendungen und ältere Programme verwendet werden, die unter dem Uninstall-Schlüssel angezeigt werden:

Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }

Sie können die Ausgabe anhand des Anzeigenamens filtern:

Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }

Diese Zeichenfolgen können jedoch möglicherweise nicht unverändert an der Eingabeaufforderung von Windows PowerShell verwendet werden.

Aktualisieren von Windows Installer-Anwendungen

Zum Aktualisieren einer Anwendung müssen Sie deren Namen und den Pfad zum Aktualisierungspaket für die Anwendung kennen. Wenn Sie über diese Informationen verfügen, können Sie eine Aktualisierung mit einem einzelnen Windows PowerShell-Befehl aktualisieren:

(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)




Inhaltsverzeichnis