Grundlagen
Grundsätzlich wird stets versucht, die ursprüngliche Setuproutine der jeweiligen Applikation zu verwenden, anstatt ein vollständiges Repackaging der Anwendung vorzunehmen. Nach der Installation der Applikation werden die gewünschten Einstellungen direkt im Paket angepasst.
Um die benötigten Registry-Schlüssel und Dateien für die entsprechenden Konfigurationen zu identifizieren, eignet sich der Ultimate Packager aus der Scripting Framework Suite optimal. Diese Anleitung demonstriert die schrittweise Erstellung eines Pakets am Beispiel der Anwendung VLC Media Player (VideoLAN).
Die Paketierung erfolgt in der Regel auf einem virtuellen Client (z. B. mit VMware Workstation). Dies ermöglicht es, den Client mithilfe von Snapshots jederzeit in den ursprünglichen Zustand zurückzusetzen. Besonders beim Testen und bei ähnlichen Aufgaben ist diese Vorgehensweise ausserordentlich hilfreich.
Voraussetzungen
Installieren Sie auf dem Packaging-Client die Scripting-Framework-Engine gemäss Anleitung. Laden Sie zusätzlich im Download-Center „WinCM Scripting Framework Engineer x.x.x.x“ herunter und installieren Sie es als Administrator über die Install.cmd. Dadurch wird das PowerShell-Modul installiert, sodass die Befehle beispielsweise auch im PowerShell ISE zur Verfügung stehen.
Vorgehen
Um das Softwarepaket zu erstellen, verwenden wir ein Template, das als Grundlage für die Paketierung dient. Im Download-Center finden Sie in der Kategorie „Templates“ das Packaging Default Template. Laden Sie dieses herunter und entpacken Sie es in ein Verzeichnis Ihrer Wahl.
Im ersten Schritt führen wir in der Regel eine manuelle Installation der zu paketierenden Applikation durch, um die erforderlichen Einstellungen der Installationsroutine zu überprüfen. Nach Abschluss der Installation wird die Applikation geöffnet, um zu prüfen, ob weitere Einstellungen vorgenommen werden sollen, wie beispielsweise das Deaktivieren von automatischen Updates.
In diesem Tutorial erstellen wir das Softwarepaket für den VLC Media Player. Zunächst laden wir die Quelldateien (Sources) von der Homepage des Herstellers herunter. Da das Paket sowohl für 32-Bit- als auch für 64-Bit-Betriebssysteme erstellt wird, laden Sie bitte beide Quellversionen herunter.
Die heruntergeladenen Dateien werden anschliessend im entpackten Template im Ordner Setup abgelegt:
.\_Manufacturer_ProductName_Version_Language_UNV_01\Classic\Setup
Der Unterordner Classic zeigt an, dass es sich um eine klassische Installation handelt. Für ein App-V-Paket benennen wir den Ordner entsprechend mit AppV, damit auf den ersten Blick erkennbar ist, um welche Art von Softwarepaket es sich handelt. Diese Ordnerstruktur ist jedoch nicht zwingend und nur als Vorschlag zu sehen.
Sehr oft können die Silent Command Line Switches für die zu paketierende Software entweder in der Dokumentation des Herstellers oder über eine Internet-Suchmaschine gefunden werden. Für VLC sind die entsprechenden Informationen hier auf der offiziellen Webseite verfügbar. Daraus ergeben sich die Argumente /L=1033 /S
für den Setup-Aufruf. Im nächsten Schritt öffnen wir die Datei Install.ps1
mit einem Editor und definieren die Installation wie folgt:
# Close Application
SF-Taskkill "vlc.exe"
# Installation
SF-Run "%_PkgSource%\Setup\vlc-3.0.21-win64.exe" "/L=1033 /S" -Wait -x64
SF-Run "%_PkgSource%\Setup\vlc-3.0.21-win32.exe" "/L=1033 /S" -Wait -x86
Mit SF-Taskkill wird VLC vor der Installation beendet. Anschliessend wird die Setuproutine mit den Silent-Parametern aufgerufen. Der Switch -Wait sorgt dafür, dass auf den Abschluss des Prozesses gewartet wird, während -x64 sicherstellt, dass der Prozess nur auf einem 64-Bit-Betriebssystem ausgeführt wird. Der Befehl SF-Run prüft zudem automatisch den Return Code. Die Scripting Framework Variable %_PkgSource% verweist stets auf den Pfad, in dem sich das Paket befindet. Die restlichen Befehle im Install.ps1 welche von dem Template als Beispiele enthalten sind, müssen gelöscht werden.
Als nächster Schritt wird das Package.xml mit den entsprechenden Anwendungsinformationen abgefüllt:
<!-- Package Definition -->
<Package>
<BuildNumber>01</BuildNumber>
<Company>UNV</Company>
<Manufacturer>VideoLAN</Manufacturer>
<ProductName>VLC media player</ProductName>
<Version>3.0.21</Version>
<VersionShort>3</VersionShort>
<Language>MUI</Language>
</Package>
Der Wert „Company“ ist dafür gedacht, wenn man z. B. mehrere Firmen oder Standorte hat und das Softwarepaket speziell dafür bestimmt ist, sodass man es entsprechend kennzeichnen kann. Sollte das Paket generell gültig sein, verwendet man den Wert „UNV“, welcher für „universal“ steht. Grundsätzlich ist man nun soweit, dass das Paket zum ersten Mal installiert werden kann. Dafür führen wir die Install.exe aus oder führen das Install.ps1 direkt über PowerShell ISE aus. Um es direkt auszuführen, muss wie unter Voraussetzungen beschrieben das Engineer Modul installiert sein.
Die Logs der Installation sind per Default unter dem Pfad „C:\Windows_ScriptingFramework\Logs\ScriptingFramework.log“ zu finden. Hinweis: Der Log Pfad lässt sich auch über eine Registry-Konfiguration anpassen. Ganz unten sollte nach der Installation folgender Eintrag zu sehen sein:
INFO: ***** Exit VideoLAN_VLC_media_player_3021_MUI_UNV_01 with Return Code: 0 ******************************************************
Auf dem Desktop und auch im Startmenü wurden Verknüpfungen angelegt, welche wir nicht möchten, weshalb wir den Install.ps1 Script am Ende erweitern und diese entfernen:
# Remove Shortcuts
SF-Delete "%_CommonDesktop%\VLC media player.lnk"
SF-Delete "%_CommonPrograms%\VideoLAN\Release Notes.lnk"
SF-Delete "%_CommonPrograms%\VideoLAN\VideoLAN Website.lnk"
Wir benennen den Template Ordner von „_Manufacturer_ProductName_Version_Language_UNV_01“ auf den Package Identifier (welchen wir im Log sehen können) auf „VideoLAN_VLC_media_player_3021_MUI_UNV_01“ um. Der Name des Ordners ist frei wählbar, wir empfehlen jedoch jeweils den Package Identifier als Ordnername zu verwenden. Zusätzlich löschen wir auch den Config Ordner, da wir diesen nicht benötigen. Dieser würde im Zusammenhang mit SF-LoadVariables für dynamische Softwarepakete benötigt werden, worauf in dieser Anleitung jedoch nicht eingegangen wird. Um die Änderung anschliessend zu testen, starten wir gleich nochmals die Installation des Paketes und stellen fest, dass die Verknüpfungen erfolgreich entfernt wurden.
Nun kümmern wir uns um die Applikationseinstellungen und stellen beim ersten Start von VLC fest, dass folgendes Fenster erscheint:
Dies bestätigen wir zunächst, jedoch soll das automatische Update deaktiviert werden. Wir beenden VLC und starten anschließend den Ultimate Packager aus der Scripting Framework Suite, um nachzuvollziehen, wo die Einstellung für das automatische Update gespeichert wird:
Der Ultimate Packager arbeitet auf Basis von Snapshots. Das bedeutet: Zuerst wird mit „Snapshot First“ der Ausgangszustand aller Registry-Einträge und Dateien aufgezeichnet. Danach wird die gewünschte Änderung auf dem Client durchgeführt und anschliessend der „Snapshot Second“ erstellt. Mit der Funktion „Compare“ werden die beiden Snapshots miteinander verglichen. Der Unterschied zwischen den Snapshots stellt dann das Ergebnis dar. Man kann sich das vorstellen, als würde man zwei Fotos machen und diese übereinanderlegen, um Unterschiede zu erkennen.
Im Ultimate Packager kann ausgewählt werden, was aufgezeichnet werden soll. Handelt es sich um Einstellungen, die der Benutzer ohne Adminrechte setzen kann, reicht es in der Regel aus, HKCU und Drive (Systemlaufwerk C:) auszuwählen. Durch das Weglassen der HKLM-Keys wird die Dauer der Snapshot-Erstellung deutlich verkürzt. Mit den Einstellungen wie auf dem Printscreen starten wir über den Button „Snapshot First“ und warten, bis die „Success“-Meldung erscheint. Anschliessend wird der VLC media player gestartet, und in den Einstellungen wird die Prüfung auf Aktualisierungen deaktiviert:
Wir speichern die geänderten Einstellungen im VLC und beenden die Applikation. Danach wird im Ultimate Packager die Aktion „Snapshot Second“ gestartet. Sobald dieser erstellt wurde, klicken wir auf „Compare“, um die beiden Snapshots miteinander zu vergleichen. Vor dem Start des Vergleichs können optional Paketinformationen für die Ausgabe angegeben werden – wir lassen diese jedoch auf „Default“ und klicken „OK“. Sobald der Vorgang abgeschlossen wurde, öffnet sich das Explorer Fenster mit dem Resultat in Form von einem SF Paket und die aufgezeichneten Dateien werden auch entsprechend in einer Struktur abgelegt. Dieses beinhaltet meistens auch Dateien, die nichts mit der eigentlichen Applikation zu tun haben, jedoch während dem Vorgang z.B. durch das Betriebssystem verändert wurden, welche bei Bedarf manuell bereinigt werden. Im Settings.xml des Ultimate Packagers könnten auch weitere Filter definiert werden. Eine Bereinigung ist in diesem Fall jedoch nicht notwendig, da wir nur die entsprechende Einstellung in unser Softwarepaket übernehmen werden. Die Benutzereinstellungen sind jeweils im Ordner „User“ zu finden, worin nun auch ein Ordner „ApplicationData“ vorhanden ist, worin die VLC Einstellungen sind. Die User Registry Einträge sind im InstallUser.ps1 zu finden, jedoch schreibt der VLC media player keine Registryeinträge. Im ApplicationData Ordner ist der Ordner „vlc“ und darin die Datei vlcrc zu sehen, worin die entsprechenden Einstellungen gespeichert sind. Den Ordner ApplicationData kopieren wir nun in unser VLC Paket und löschen im vlc Ordner alles bis auf die vlcrc Datei:
.\VideoLAN_VLC_media_player_3021_MUI_UNV_01\Classic\Setup\User
Im Template sind die zwei Dateien Disabled_InstallUser.ps1 und InstallUser.ps1 enthalten. Sollten keine Benutzereinstellungen benötigt werden, wird die InstallUser.ps1 gelöscht, damit nur die Disabled_InstallUser.ps1 vorhanden ist und somit die Benutzereinstellungen für das Softwarepaket deaktiviert sind. In unserem Fall möchten wir jedoch Benutzereinstellungen schreiben und löschen deshalb die Disabled_InstallUser.ps1. Nun muss im InstallUser.ps1 noch definiert werden, dass diese Datei kopiert wird. Wichtig als Hintergrundwissen ist, dass Einstellungen, welche das Benutzerprofil betreffen, nicht im Install.ps1 gemacht werden dürfen. Die Installation wird über die Softwareverteilung in der Regel unter dem SYSTEM Account durchgeführt, und würde man dort benutzerbezogene Einstellungen schreiben, würden diese nur im Benutzerprofil des SYSTEM Accounts landen, jedoch nicht im Profil des angemeldeten Benutzers! Deshalb bietet Scripting Framework mit der InstallUser.ps1 eine sehr einfache und effiziente Lösung an, womit Benutzereinstellungen vorgenommen werden können. Nun editieren wir die InstallUser.ps1 wie folgt:
#===================================================================================================
# Installation User
# ===================================================================================================
# Copy Files / Folders
SF-Copy "%_PkgCache%\User\ApplicationData" "%_ApplicationData%" -Changed
# ===================================================================================================
# END
# ===================================================================================================
Wir verwenden für den SF-Copy Befehl den Parameter -Changed, damit die Datei in jedem Fall überschrieben wird. Im InstallUser.ps1, welches der Ultimate Packager erstellt hat, wäre der benötigte Copy-Befehl für den ApplicationData Ordner auch zu finden. Die Installation kann jetzt nochmals gestartet werden, um die Änderung zu testen. Die Aktionen der InstallUser.ps1 werden in das Benutzerlog von Scripting Framework geschrieben, welches per Default hier zu finden ist, worin auch das Resultat überprüft werden kann: „%LOCALAPPDATA%\_ScriptingFramework\Logs\ScriptingFramework.log“.
Das Uninstall.ps1 beinhaltet die Deinstallation der Applikation, welche wir wie folgt vornehmen und über die Uninstall.exe testen können:
# ===================================================================================================
# Uninstallation
# ===================================================================================================
# Close Application
SF-Taskkill "vlc.exe"
# Uninstallation
SF-Run "%_ProgramFiles32%\VideoLAN\VLC\uninstall.exe" "/S" -SkipIfNotExist -Wait -x86
SF-Run "%_ProgramFiles64%\VideoLAN\VLC\uninstall.exe" "/S" -SkipIfNotExist -Wait -x64
# Remove Files
SF-RD "%_ProgramFiles64%\VideoLAN\VLC"
SF-RD "%_ProgramFiles64%\VideoLAN" -Empty
# ===================================================================================================
# END
# ===================================================================================================
Zuletzt legen wir jeweils noch das Icon der Applikation mit dem Namen Main.ico im Ordner Icon ab, welches z.B. für den Intune Generator verwendet wird: .\VideoLAN_VLC_media_player_3021_MUI_UNV_01\Icon\Main.ico. Das Icon kann mit einem IconGrabber aus der EXE-Datei extrahiert werden.
Das Softwarepaket ist nun fertiggestellt und kann verwendet werden. Ein fertiges VideoLAN VLC media player Paket ist auch in unserem Download Center unter den Beispielpaketen zu finden.