Categories
Allgemein Windows
PowerShell, PowerShell App, PowerShell App Deployment Toolkit

Softwarepaketierung mit dem PowerShell App Deployment Toolkit

Herausforderungen

Im Geschäftsumfeld steht man regelmäßig vor der Herausforderung, klassische Softwareapplikationen zu verteilen und aktuell zu halten. Hierbei soll der Installationsvorgang nach Möglichkeit vollständig bedienerlos, also ohne notwendige Interaktion mit dem Benutzer auskommen. Die Konfiguration der Software soll nach Möglichkeit automatisch erfolgen und die automatische Suche nach evtl. verfügbaren Updates soll möglichst unterbunden werden, um ein zentrales Management von Updates zu ermöglichen. Die für eine automatische Verteilung der Software benötigte Infrastruktur ist womöglich bereits in Form von Intune oder Microsoft Endpoint Configuration Manager vorhanden und leisten gute Dienste bei der Umsetzung der Verteilung fertiger Pakete. Jedoch fehlt diesen Systemen oft das passsende Werkzeug, um die wiederkehrenden Anforderungen einer einfachen und flexiblen Erstellung der benötigten Softwarepakete zu unterstützen. In diesem Beitrag geht es um die Vorstellung des PowerShell App Deployment Toolkit, das für diesen Zweck entwickelt worden ist und seit nunmehr einigen Jahren wertvolle Dienste im Bereich der Softwarepaketierung leistet. Anhand eines einfach gehaltenen Beispiels sollen einige Möglichkeiten aufgezeigt werden, die das Toolkit bietet. Das Deployment Toolkit ist von bemerkenswert guter Qualität, sehr ausführlich dokumentiert und erfreut sich daher großer Beliebtheit.

Erste Schritte

Dieser Beitrag verwendet Notepad++ als Beispiel für eine zu installierende Applikation, weil sich die Paketierung hierbei besonders einfach gestaltet, Notepad++ kostenlos verfügbar ist und einen recht hohen Bekanntheitsgrad besitzt. Das gezeigte Beispiel lässt sich jedoch auch auf andere Softwaretitel übertragen.

Download der benötigten Dateien

Zunächst wird die aktuelle Version des PowerShell App Deployment Toolkit heruntergeladen. Der Download wird in Form einer Zip-Datei angeboten, die zunächst in einen lokalen Ordner entpackt werden muss. Nachdem man dies erledigt hat, zeigt sich folgender Inhalt:

Das Toolkit Unterverzeichnis enthält die zentralen Dateien des PowerShell App Deployment Toolkit und dient gleichzeitig als Vorlage für zu erstellende Pakete. Die begleitende Dokumentation, die im Toolkit als PDF-Datei enthalten ist, stellt eine sehr umfangreiche Anleitung und Referenz dar, die weit über die hier vorgestellte Einführung des Toolkit hinaus geht.

Um das Beispielpaket erstellen zu können, wird natürlich auch die Installationsdatei von Notepad++ benötigt. Hierbei handelt es sich um eine vollständige Installationsdatei, die alle benötigen Quellen beinhaltet und somit vollständig offline, d. h. ohne Dateien aus dem Internet nachladen zu müssen, installiert werden kann. Falls man die Wahl hat, sollte immer ein solcher Offline Installer bevorzugt werden, da diese i. d. R. besser für eine Paketierung geeignet sind.

Vorbereitungen

Um mit der Paketierung zu beginnen, kopiert man zunächst den gesamten Inhalt des Ordners Toolkit in ein neu angelegtes Verzeichnis. In diesem Beispiel nennen wir das Verzeichnis Notepad++ – 8.4.0.0. Zum Zeitpunkt, als dieser Beitrag entstand, war 8.4 die aktuell verfügbare Version von Notepad++:

Der neu angelegte Ordner zeigt folgenden Inhalt:

  • Das Unterverzeichnis AppDeployToolkit enthält die zentralen Komponenten des Toolkit, die aus einigen Skript- sowie einer Konfigurationsdatei bestehen. Außerdem enthält der Ordner eine PNG Datei, mit der sich die Darstellung zur Laufzeit des Toolkit an eigene Bedürfnisse anpassen lässt.
  • Der Ordner Files ist zunächst leer und dient vereinbarungsgemäß zur Aufnahme der Quelldateien, die für die Installation der zu paketierenden Software benötigt werden, also z. B. eine MSI oder Setup.exe Datei. Bei umfangreicheren Installationen können auch mehrere Dateien oder ganze Verzeichnisstrukturen im Ordern Files enthalten sein.
  • Das Verzeichnis SupportFiles ist für Dateien gedacht, die zwar nicht unmittelbar mit der Installation zu tun haben, die aber womöglich zur Konfiguration oder zum Entfernen vorhergehender Versionen benötigt werden.
  • Deploy-Application.ps1 ist die Datei, mit der die eigentliche Logik der Installation festgelegt wird und in den meisten Fällen gleichzeitig die einzige Datei, die inhaltlich angepasst werden muss. Die Skriptdatei enthält bereits rund 200 Zeilen PowerShell Code, der lediglich an festgelegten Stellen ergänzt werden muss. Falls sich einem der Sinn der bereits vorhandenen Codezeilen nicht erschließt, so macht das nichts, da die wenigen Stellen, die angepasst werden müssen, auffällig markiert sind.
  • Deploy-Application.exe ist eine ausführbare Datei, die im Wesentlichen das zuvor genannte PowerShell Skript Deploy-Application.ps1 zur Ausführung bringt. Vereinbarungsgemäß wird die Installation durch Ausführen von Deploy-Application.exe gestartet. Das Verhalten kann durch Kommandozeilenparameter noch beeinflusst werden, was später noch gezeigt wird.
  • Bei der Datei Deploy-Application.exe.config handelt es sich um eine Konfigurationsdatei, die aus technischen Gründen erforderlich ist, hier aber nicht näher betrachtet wird.

Erstellen des Softwarepakets

Zuerst wird die heruntergeladene Setupdatei von Notepad++ in den Ordner Files kopiert:

Anschließend wird die Datei Deploy-Application.ps1 zum Bearbeiten geöffnet, z. B. mit PowerShell ISE:

Variablen

Gleich zu Beginn der Skriptdatei befindet sich ein Block mit Variablendeklarationen, der zunächst in etwa so aussieht:

Die Variablen werden für das Paket Notepad++ entsprechend wie folgt angepasst:

Die so angegeben Werte dienen nicht nur zur Dokumentation des Pakets, sie treten zusätzlich zur Laufzeit der Installation an verschiedenen Stellen wieder in Erscheinung, dazu später mehr.

Schließen von Anwendungen

Eine häufige Herausforderung beim Update einer bereits installierten Software besteht darin, zu erkennen, ob die zu aktualisierende Software womöglich gerade in Verwendung ist und beendet werden muss, bevor die Aktualisierung störungsfrei erfolgen kann. Zu diesem Zweck bietet das PowerShell Application Deployment Toolkit eine spezielle Funktion, die im Skript bereits eingebaut ist, aber noch angepasst werden muss. Etwa in Zeile 120 unterhalb des Kommentars PRE-INSTALLATION findet sich diese Zeile:

Die Funktion Show-InstallationWelcome erfüllt gleich mehrere Aufgaben, u. a. lassen sich laufende Programme erkennen und schließen. Das erneute Starten der so identifizierten Programme wird außerdem für die Dauer der Installation unterbunden. Je nachdem, wie die Ausführung des Skripts über Deploy-Application.exe gestartet worden ist, erfolgt die Aufforderung zum Schließen der Programme interaktiv oder die Programme werden im Hintergrund automatisch geschlossen. Im Falle einer interaktiven Ausführung hat der Benutzer außerdem die Möglichkeit, die Installation bis zu drei Mal hinauszuschieben. In der Skriptvorlage ist Internet Explorer als Beispiel aufgeführt, was in unserem Fall nicht viel Sinn ergibt, da wir ja Notepad++ installieren und ggf. schließen wollen. Die Skriptzeile muss also wie folgt geändert werden:

Der Name, der hier angegeben wird, muss dem Dateinamen der ausführbaren Datei entsprechen, allerdings ohne die Endung .exe. Es lassen sich hier auch mehrere Applikationen, jeweils durch Komma getrennt angeben. Zusätzlich ließe sich, mit einem Gleichheitszeichen eingeleitet, auch ein beschreibender Name angegeben werden, z. B. ‚‘winword=Microsoft Word‘.

Zur Laufzeit der Installation wird der Benutzer aufgefordert, Notepad++ zu schließen. Dieser Dialog erscheint allerdings nur dann, wenn Notepad++ tatsächlich in Verwendung sein sollte:

Die Funktion Show-InstallationWelcome lässt sich auch so verwenden, dass dem Benutzer an dieser Stelle ein Countdown angezeigt wird, nach dessen Ablauf die geöffnete Anwendung gezwungenermaßen geschlossen wird.

Deployment Modes

Das Anzeigen eines Dialogs, den der Benutzer womöglich noch interaktiv beantworten muss, entspricht nicht unbedingt den Anforderungen einer bedienerlosen Installation. Das Verhalten des Toolkit lässt sich daher beim Aufruf von Deploy-Application.exe über das Argument DeployMode steuern und den jeweiligen Anforderungen entsprechend anpassen. Folgende Deployment Modes stehen zur Auswahl:

  • Interactive – Alle interaktiven Dialoge werden angezeigt. Dies ist gleichzeitig der Standard, wenn kein Deployent Mode explizit angegeben wird.
  • Silent – Weitgehend alle Benachrichtigungen werden unterdrückt, außer den oben erwähnten Willkommensdialog zum Schließen laufender Anwendungen.
  • NonInteractive – Keine Dialoge werden angezeigt.

Ausführen der Notepad++ Installationsdatei

Die meisten professionellen Installationsprogramme ermöglichen die bedienerlose Installation durch Angabe geeigneter Kommandozeilenparameter, die dazu führen, dass das Setup im Hintergrund ausgeführt wird, ohne dass ein Benutzer oder Administrator interaktiv in die Installation eingreifen muss. Herauszufinden, welche Kommandozeilenparameter zu diesem Zweck verwendet werden müssen, kann mehr oder weniger aufwändig sein und erfordert in aller Regel eine entsprechende Recherche. Im Falle von Notepad++ erfolgt eine bedienerlose Installation sehr einfach durch Angabe des Parameters /S auf der Kommandozeile:

npp.8.4.Installer.x64.exe /S

Diese Kommandozeile muss nun durch das Deployment Skript ausgeführt werden. Hierzu sucht man den bereits in der Vorlage vorhandenen Kommentar <Perform Installation tasks here> und fügt darunter die dargestellten Zeilen in den Skriptcode ein:

Um den Skriptcode wiederverwendbar zu gestalten, wird hier der Dateiname der Notepad++ Installationsdatei dynamisch ermittelt. Dies bietet den Vorteil, dass derselbe Skriptcode auch noch mit zukünftigen Versionen von Notepad++ funktionieren wird, ohne angepasst werden zu müssen. Die Variable $dirFiles ist eine durch das Toolkit bereitgestellte Variable und enthält zur Laufzeit des Skripts den absoluten Pfad zum weiter oben erwähnten Files Ordner.

Um die für Notepad++ notwendige Kommandozeile im Deploymentskript auszuführen, bieten sich in PowerShell verschiedene Möglichkeiten, z. B. das Cmdlet Start-Process. Das PowerShell App Deployment Toolkit bietet aber zu diesem Zweck eine eigene Funktion namens Execute-Process, die in diesem Zusammenhang einige Vorteile bietet und daher hier verwendet werden soll. Einige Vorteile, die sich bei der Nutzung von Execute-Process gegenüber nativen PowerShell Funktionen ergeben:

  • Ausführliches Logging mit Umleitung der Konsolenausgaben
  • Gezieltes ignorieren bestimmter Rückgabecodes mit Hilfe des Arguments -IgnoreExitCodes
  • Berücksichtigung des Ordners Files zur Laufzeit, d. h. Dateien in diesem Ordner brauchen nicht mit absolutem Pfad angegeben zu werden

Bevor die Installation von Notepad++ im Rahmen des PowerShell App Deployment Toolkit zum ersten Mal getestet wird, sollte man sich zunächst isoliert davon überzeugen, dass die bedienerlose Installation an sich so funktioniert, wie erwartet. Bei umfangreichen Installationen kann es Sinn ergeben, eine VM (Virtuelle Maschine) für die Durchführung der Tests zu verwenden, die mit Hilfe von Snapshots jederzeit wieder „auf Anfang“ zurückgesetzt werden kann, also auf einen Zeitpunkt vor der Installation der zu paketierenden Software. Im Falle von Notepad++ kann aber nach einem Testdurchlauf die Software auch einfach mit Windows-Bordmitteln wieder deinstalliert werden, um den Test ggf. wiederholen zu können.

Hinzufügen einer Deinstallation

Eine Paketierung sollte nicht nur den Installationsfall berücksichtigen, sondern immer auch die Deinstallation der jeweiligen Applikation. Das Toolkit sieht hierfür die Sektion UNINSTALLATION in der Datei Deploy-Application.ps1 vor. Der Skriptcode, der für die bedienerlose Deinstallation zuständig ist, kann im Falle von Notepad++ so aussehen:

Testlauf

Um das erstellte Softwarepaket zu testen, sollte man das gesamte Paketverzeichnis auf einen Testcomputer kopieren, falls man es nicht ohnehin bereits dort entwickelt hat. Anschließend öffnet man eine PowerShell oder klassische cmd Konsole „als Administrator“, wechselt in das Paketverzeichnis und startet die Installation mit dieser Kommandozeile:

.\Deploy-Application.exe -DeploymentType Install -DeployMode Interactive

Die hier gezeigten Kommandozeilenargumente sind nur zur Anschauung erwähnt und könnten in diesem Fall sogar komplett entfallen, weil Install und Interactive die Standardwerte der jeweiligen Argumente darstellen.

Falls, wie hier angenommen, Notepad++ zum Zeitpunkt der Installation verwendet wird, erfolgt eine Aufforderung, das Programm zu schließen:

Anschließend wird während der Installation dieses Fenster angezeigt:

Bei erfolgreichem Abschluss erfolgt diese Meldung. Wie der Hinweistext vermuten lässt, kann und sollte der Wortlaut der Meldung noch angepasst werden:

Der Hinweistext befindet sich ebenfalls in der Skriptdatei Deploy-Application.ps1 in der Sektion POST-INSTALLATION:

Ein Blick in das Windows Startmenü bestätigt, dass die Installation von Notepad++ erfolgreich war:

Die Deinstallation des Softwarepakets lässt sich mit folgender Kommandozeile testen:

.\Deploy-Application.exe -DeploymentType Uninstall -DeployMode Interactive

Fehlersuche

Falls die Installation nicht erfolgreich gewesen sein sollte, bietet das umfangreiche Logging des PowerShell App Deployment Toolkit eine Möglichkeit, den Einstieg in die Fehleranalyse zu finden. Falls nicht anders konfiguriert, erstellt das Toolkit seine Logdateien im Verzeichnis C:\Windows\Logs\Software.

Der Name der Logdatei wird aus den Werten der Variablen generiert, die wir zu Beginn in der Skriptdatei eingestellt haben.

nach oben