Tags: Software-Distribution, Patch-Management, PowerShell
Zu den Neuerungen von PowerShell 5.0 zählte ein Package Management, mit dem sich Software-Pakete von verschiedenen Quellen herunterladen und installieren lassen. Mit dabei ist auch ein Provider für MSI und MSU, so dass man auch Win32-Programme auf der Kommandozeile hinzufügen oder deinstallieren 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 Systemsteuerung dar.
Nachdem die neue Paketverwaltung 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 Installationsquellen zuständig sein. Solche für PowerShellGet, MSI oder MSU sind bereits an Bord.
Cmdlets für alle Aufgaben des Paket-Managements
Insgesamt deckt das Management von Software-Paketen folgende Bereiche ab:
- Management von Installationsquellen 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.
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.
Nach Software suchen und installieren
Nachdem die meisten Installationsquellen ü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 Installationsformaten 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.
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 Installationsquellen hantieren muss. Die von Microsoft standardmäßig vorgegebenen Repositories wie PSGallery sind zudem nicht vertrauenswü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
Verwandte Beiträge
- PowerShellGet-Modul aktualisieren, auf PSResourceGet umsteigen
- winget erhält PowerShell-Modul und Configuration Management
- Microsoft Defender: Updates für Viren-Signaturen über Gruppenrichtlinien und PowerShell steuern
- baramundi Management Suite 2022 R1: Support für neues Android-API, Mehrstufige Genehmigungen von Tickets, SSH für Network Devices
- Exchange 2019: Neue Intervalle für CUs, kostenlose Hybrid-Lizenz, Update für Management Tools
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
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.