Programme installieren und entfernen mit PowerShell Package Management


    Tags: , ,

    Packet Management, Programme entfernenZu den Neuerungen von PowerShell 5.0 zählte ein Package Management, mit dem sich Software-Pakete von verschiedenen Quellen herunter­laden und instal­lieren lassen. Mit dabei ist auch ein Provider für MSI und MSU, so dass man auch Win32-Pro­gramme auf der Kom­mando­zeile hinzu­fügen oder dein­stallieren kann.

    Microsoft verfolgt mit dem Package-Management zum einen die Absicht, ein Windows-Äquivalent zu Linux-Tools wie RPM oder apt-get zu schaffen. Mit ihnen lassen sich Pakete samt Abhängigkeiten von Online-Quellen herunterladen und installieren.

    Modulare Architektur

    Zum anderen soll das Feature die Möglichkeit bieten, auch herkömmliche MSI-Pakete oder Updates in Form von MSU-Dateien zu verwalten. Theoretisch stellt das Package Management somit eine Alternative zur GUI in der System­steuerung dar.

    Nachdem die neue Paket­verwaltung mehrere Formate unterschiedlicher Herkunft verarbeiten soll, verfolgt Microsoft einen modularen Ansatz, bei dem sich je nach Quelle und Typ eigene Provider in das System einklinken. Jeder davon kann für eine oder mehrere Installations­quellen zuständig sein. Solche für PowerShellGet, MSI oder MSU sind bereits an Bord.

    Installierte Package-Provider ermitteln mit Get-PackageProvider

    Cmdlets für alle Aufgaben des Paket-Managements

    Insgesamt deckt das Management von Software-Paketen folgende Bereiche ab:

    • Management von Installations­quellen und der ihnen zugeordneten Provider
    • Auffinden von Software-Paketen
    • Installation von Programmen
    • Anzeigen und Entfernen von installierter Software

    Das Package Management von PowerShell versammelt für diese Aufgaben mehrere Cmdlets in einem Modul. Eine Übersicht kann man mit dem Befehl

    Get-Command -Module PackageManagement

    anzeigen lassen.

    Quellen anzeigen, Provider installieren

    Am Anfang wird man zuerst herausfinden wollen, welche Quellen zur Verfügung stehen. Diese Information kann man sich mit

    Get-PackageSource

    erhalten.

    Installationsquellen anzeigen mit Get-PackageSource

    Dabei erfährt man gleich, welcher Provider dafür zuständig ist und ob es sich dabei um eine vertrauenswürdige Quelle handelt.

    Möchte man sich dann die verfügbaren Programme auf einem Online-Repository wie etwa Chocolatey auflisten lassen, dann führt man diesen Befehl aus:

    Find-Package -Provider chocolatey

    Nachdem der entsprechende Provider standardmäßig nicht installiert ist, bietet PowerShell beim ersten Aufruf an, dies nachzuholen. Wenn man auf diese Nachfrage verzichten und ihn automatisch hinzufügen möchte, dann gibt man den Schalter ForceBootstrap an.

    Benötigte Provider können automatisch installiert werden.

    Nach Software suchen und installieren

    Nachdem die meisten Installations­quellen über eine Vielzahl von Paketen verfügen, wird man die Suche in den meisten Fällen eingrenzen wollen. Dafür kann man den Parameter Name zusammen mit Wildcards verwenden:

    Find-Package -Provider chocolatey -name notepad*

    Dieses Beispiel würde das MSI-Paket für Notepad++ finden. Möchte man es installieren, dann kann man das Ergebnis dieses Aufrufs gleich über eine Pipe an Install-Package weiterleiten:

    Find-Package -Provider chocolatey -name notepadplusplus |
    Install-Package

    Dient ein öffentliches Repository als Quelle, dann fragt PowerShell nach, ob man dieser vertraue und von dort Software installieren möchte.

    Execution-Policy als Hürde

    In der Regel vermittelt das Package Management nach positiver Antwort den Eindruck, als würde es das gewünschte Programm herunterladen und einrichten. Man wird aber anschließend schnell feststellen, dass der Vorgang sang- und klanglos gescheitert ist.

    Ursache dafür ist zumeist eine zu restriktive Execution-Policy, die man mit

    Set-ExecutionPolicy Bypass

    weiter lockern muss.

    Alternativ besteht die Möglichkeit, einen MSI-Installer manuell über einen Web-Browser herunterzuladen und ihn dann über PowerShell auszuführen:

    Install-Package -Name ".\7z920.msi" -force

    Der Parameter Force unterdrückt die Nachfrage, ob man das Paket wirklich installieren möchte.

    Nachdem das PowerShell Package Management von den verschiedenen Installations­formaten abstrahiert, würde etwa das Hinzufügen eines PowerShell-Moduls über den Provider PowerShellGet nach dem gleich Muster funktionieren, nur dass man hier in der Regel PSGallery als Quelle angeben wird.

    Installierte Programme anzeigen

    Nach der Installation einer Win32-Anwendung taucht diese üblicherweise in der Systemsteuerung unter Programme => Programme deinstallieren auf. Alternativ kann man die dort gelistete Software mit

    Get-Package -Provider Programs -IncludeWindowsInstaller

    anzeigen lassen.

    Installierte Win32-Programme lassen sich über den Provider MSI bzw. Programs anzeigen.

    Auch diesen Aufruf kann man über den Parameter Name weiter einschränken:

    Get-Package -Provider Programs -IncludeWindowsInstaller -Name "7-Zip*"

    Theoretisch kann man das Ergebnis dieses Befehls gleich an Uninstall-Package weiterleiten, um die Software zu entfernen:

    Get-Package -Provider Programs -IncludeWindowsInstaller -Name "7-Zip*" |
    Uninstall-Package

    In der Praxis scheiterte das Cmdlet bei meinen Versuchen aber regelmäßig an dieser Aufgabe.

    Neben den installierten Programmen kann man über den Provider MSU auch die auf einem System vorhandenen Updates abrufen:

    Get-Package -Provider MSU | fl -Property name, summary

    Die Ausgabe dieses Kommandos ist aufschlussreicher als jene von Get-Hotfix, weil sie über die Eigenschaft Summary auch die Beschreibung eines Patches ausgibt.

    Fazit

    Das Package Management in PowerShell 5.0, das sich über das WMF auch auf älteren Versionen des OS nachrüsten lässt, ist ein umfassendes Framework für das Hinzufügen und Entfernen unterschiedlicher Software-Pakete.

    Aufgrund dieses universellen Anspruchs ist es aber relativ umständlich zu bedienen, weil man mit Providern und Installations­quellen hantieren muss. Die von Microsoft standard­mäßig vorge­gebenen Repositories wie PSGallery sind zudem nicht vertrauens­würdig, weil es sich dabei um Community-Projekte handelt.

    Schließlich hakt das Management von Win32-Programmen häufig und erfordert oft das Absenken der Execution-Policy auf den niedrigsten Level.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut

    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links

    3 Kommentare

    Hallo,
    danke für die sehr interessanten Infos. Kann man mit "Get-Package -Provider MSU | fl -Property name, summary" auch mit einem Zusatz auf Remote-PCs zugreifen? Und wenn man dann die Updates hat, kann man mit einem bestimmten Befehl diese auch remote entfernen?
    Viele Grüße
    Renate

    Bild von Wolfgang Sommergut

    Get-Package unterstützt den Parameter ComputerName nicht, aber man kann das Cmdlet natürlich über PS-Remoting (Enter-PSSession, Invoke-Command) auf einem anderen Rechner ausführen. Für das Entfernen eines Pakets ist Uninstall-Package zuständig.

    Danke für die schnelle Antwort. Ich bin noch ziemlich ungeübt in Sachen Powershell, sorry.
    Mit Get-Hotfix habe ich auf dem Remote-PC herausbekommen, dass KB... installiert ist.
    Ziel-PC hat noch Windows 7. Mit welchem Befehl kann ich dieses Update deinstallieren? Ich verstehe das noch nicht so ganz, wie man das mit Uninstall-Package machen kann. Der Hotfix-Name ist ja nicht der Package-Name, oder? Mit Enter-PSSession komme ich nicht auf den PC.