PowerShell 5.0: Grundlagen der Paketverwaltung mit PackageManagement
Über PackageManagement ermöglicht die PowerShell 5.0 die Skript-basierte Paketverwaltung. Ein Überblick über die wichtigsten Cmdlets.
Mit Windows 10 hat Microsoft PackageManagement vorgestellt, einen System-Aggregator auf Basis der PowerShell 5.0, der über ein einheitliches Set an PowerShell-Cmdlets das Arbeiten mit unterschiedlichen Installer-Technologien ermöglicht. PackageManagement war bisher als OneGet-Framework bekannt und nutzt Installer um Softwarepakete zu finden, zu installieren und zu warten.
Die PackageManagement-Cmdlets sind Teil der entsprechenden PackageManagement-Module der PowerShell 5.0. Die PowerShell 5.0 mitsamt der PackageManagement-Module ist auch über das Windows Management Framework 5.0 erhältlich. Zudem hat Microsoft mittlerweile eine Preview von PackageManagement für die PowerShell-Versionen 3 und 4 veröffentlicht, mit denen sich die Paketverwaltung auch auf Windows-Systemen abseits von Windows 10 verwenden lässt.
Blick unter die Haube von PackageManagement
Desktop-Administratoren nutzen sehr häufig unterschiedlichste Installer-Technologien, um ihre Softwarepakete zu verwalten. Dies kann zum Beispiel klassische Installer wie MSI und MSU genauso beinhalten wie die neueren Plattformen NuGet oder Chocolatey. Die Verwendung unterschiedlicher Technologien verkompliziert aber natürlich Automatisierung und Management von Software-Deployments.
PackageManagement verspricht hier Abhilfe. Neben den spezifischen PowerShell-Cmdlets beinhaltet PackageManagement auch eine Komponente, die das Finden, Inventarisieren oder Installieren von Software koordiniert. Diese Komponente stellt auch die nötigen Programmierschnittstellen für die Kommunikation zwischen PackageManagement und den Anbietern der Paketquellen zur Verfügung.
Paketanbieter ermöglichen den Zugriff auf unterschiedliche Quellen an Softwarepaketen. Dabei dient jeder Anbieter als Brücke zwischen PackageManagement und einer oder mehreren Quellen. PackageManagement beinhaltet zum Beispiel den PowerShellGet-Anbieter, um auf die PowerShell Gallery von Microsoft zugreifen zu können, ein zentrales Repository für PowerShell-Befehle und DSC-Ressourcen (Desired State Configuration). Als Quelle kann dabei jedes unterstützte Repository an Softwarepaketen fungieren, egal ob lokal oder remote.
Standardmäßig unterstützt PackageManagement vier Anbieter:
- MSI ermöglicht die Nutzung lokaler .msi-Pakete,
- MSU bietet Zugriff auf lokal verfügbare Update-Dateien,
- der Programs-Provider ermöglicht den Zugriff auf lokale Software, die über Windows Add/Remove Programs hinzugefügt wurde – allerdings nur zur Inventarisierung,
- PowerShellGet ermöglicht die Nutzung der PowerShell Gallery.
Zusätzlich zu den vier standardmäßig unterstützten Providern beinhaltet PackageManagement aber auch eine sehr einfache Möglichkeit, Anbieter wie NuGet, Chocolatey oder GistProvider zu integrieren.
Die wichtigsten Cmdlets für PackageManagement
Das PackageManagement-Modul enthält derzeit 13 Cmdlets, um Informationen über Pakete zu erhalten und diese Pakete zu verwalten. So kann man Beispielsweise das Get-Package-Cmdlet verwenden, um Informationen über eine per MSI-Installer bereitgestellte Software abzurufen:
get-package -providername msi
Der PowerShell-Befehl gibt für jedes MSI-Programm den Namen, die Version und den Quell-Ordner an. Man kann sich aber auch eine Liste der verfügbaren Anbieter anzeigen lassen, dies erfolgt über das Get-PackageProvider-Cmdlet:
get-packageprovider –listavailable
Das Attribut –listavailable lässt eine Liste aller lokal installierten Provider anzeigen, nicht nur die in der jeweiligen Sitzung laufenden. Als Minimum sollte der Befehl zumindest immer die vier Standard-Provider angeben, die ja immer installiert und verfügbar sind.
Um sich eine Liste aller derzeit konfigurierten Quellen anzeigen zu lassen, kann das Cmdlet Get-PackageSource verwendet werden, das einfach alle Quellen oder nur die für einen bestimmten Anbieter verfügbaren Quellen anzeigen kann. Der folgende Befehl listet zum Beispiel alle Quellen für den PowerShellGet-Provider auf:
get-packagesource -providername PowerShellGet
Standardmäßig wird hier nur eine Ressource aufgeführt, PSGallery, also die PowerShell Gallery. Anbieter lassen sich aber auch hinzufügen, um dann weitere Quellen für jeden Provider hinzufügen zu können. Bevor man einen Anbieter hinzufügt, sollte man über das Find-PackageProvider-Cmdlet überprüfen, welche Provider für das lokale System verfügbar sind. Hierfür kann der Befehl auch zunächst ohne jede weitere Spezifizierung ausgeführt werden. Für jeden Anbieter wird das Cmdlet den Namen, die Version und Quelle sowie eine zusammenfassende Beschreibung ausgeben.
Beim ersten Ausführen des Find-PackageProvider-Cmdlets wird man eine Fehlermeldung erhalten, wonach der NuGet-Provider nicht installiert ist. Für viele Funktionen von PackageManagement muss zunächst NuGet installiert werden, was einfach durch Bestätigung in der Benachrichtigung erledigt werden kann – PackageManagement kümmert sich dann um den Rest.
Ab diesem Zeitpunkt lässt sich das Install-PackageProvider-Cmdlet verwenden, um einen der verfügbaren Anbieter zu installieren. Wer beispielsweise Chocolatey installieren will, kann dies über den folgenden Befehl erledigen:
install-packageprovider -name chocolatey -scope currentuser
Das scope-Attribut kann dabei unter Umständen auch weggelassen werden, je nachdem wie die PowerShell ausgeführt wird und welche Rechte der Anwender hat. Wenn beim Ausführen des Befehls ein Zugriffsfehler angezeigt wird, sollte das Attribut angehängt werden. Wird die PowerShell als Administrator ausgeführt, sollte es dagegen weggelassen werden.
Nachdem der Befehl eingegeben wurde, muss die Auswahl noch bestätigt werden, erst dann erfolgt die Installation. Anschließend muss über das Import-PackageProvider-Cmdlet der Anbieter noch zur aktuellen Sitzung hinzugefügt werden:
import-packageprovider -name chocolatey
Sobald der Provider importiert wurde, kann das Register-PackageSource-Cmdlet verwendet werden, um eine Chocolatey-Quelle als Repository hinzuzufügen. Hierbei muss eine Name für die Quelle, der Provider-Name sowie die URL des Repository angegeben werden:
Register-PackageSource -name choc2 -providername chocolatey -location http://chocolatey.org/api/v2/ -trusted
In diesem Beispiel lautet der zugewiesene Name choc2 und es wurde das Attribut –trusted hinzugefügt, wodurch die PowerShell den Befehl ohne weitere Bestätigung ausführt. Anschließend kann der Find-Package-Befehl ausgeführt werden, um sich eine Liste der verfügbaren Pakete anzeigen zu lassen:
find-package -provider chocolatey -source choc2
Wenn dieser Befehl ausgeführt wird, sieht man schnell, dass über diese Quelle hunderte Pakete verfügbar sind. Aus diesem Grund wird man die Suche sicherlich eingrenzen wollen, was mit dem folgenden Befehl beispielsweise für alle Pakete rund um Notepad2 möglich ist:
find-package -provider chocolatey -source choc2 -name notepad2
In diesem Fall gibt der Befehl nur noch einen Treffer aus und das entsprechende Paket kann über die Pipe-Funktion ganz einfach über das Install-Package-Cmdlet installiert werden:
find-package -provider chocolatey -source choc2 -name notepad2 | install-package
Mit diesen einfachen Befehlen lassen sich per PackageManagement umfangreiche Softwarepakete installieren. Die gleichen Schritte können zur Installation von Paketen aus anderen Quellen durchgeführt werden. Allerdings sollte man darauf achten, dass zur Installation die Execution Policy der PowerShell auf Remote Signed oder Unrestricted stehen muss. Andernfalls werden die Pakete zwar ins lokale System kopiert, die Applikation selbst wird aber nicht installiert.
Folgen Sie SearchDataCenter.de auch auf Twitter, Google+, Xing und Facebook!