Table of Contents
Mit der neusten Version von Windows 10 (Version 2004) ist es nun endlich möglich auch ohne spezielle Anpassung MSIX App Attach in Citrix zu nutzen.
MSIX App Attach erlaubt es, Anwendungen für virtuelle Umgebungen außerhalb einer virtuellen Maschine in einer VHD/X Datei zu speichern. Eine solche Anwendung kann somit bei Bedarf in die Benutzersitzung eingebunden werden.
Was ist MSIX App Attach ?
MSIX App Attach basiert auf dem Konzept, bei dem die Anwendung im MSIX-Format an einem zentralen Ort gespeichert und in das Betriebssystem eingebunden wird. Nach dem Einbinden sehen Anwendungen sowohl für den Benutzer als auch für das Betriebssystem wie lokal installiert aus. Beim Kombinieren von FSLogix Profil Containern und MSIX App Attach bleibt das Betriebssystem des Golden Master Image vollständig sauber und Daten, Profile und Anwendungen sind vollständig getrennt.
MSIX, das 2018 auf den Windows Developers Days angekündigt wurde, ist ein neues universelles Paketformat, das für Windows 10 Anwendungen entwickelt wurde. Desktop-, Mobil- und alle anderen Windows 10-Geräte werden unterstützt. Microsoft präsentierte uns MSIX als eine verbesserte Version des AppX-Pakets (ursprünglich nur für UWP-Anwendungen verwendet), um traditionelle Desktop Anwendungen unter Windows 10 besser zu unterstützen, indem das Wissen aus den MSI- und App-V-Paketen und dem Desktop Bridge-Programm mitgebracht wurde.
Ein MSIX Paket ist einem AppX oder App-V Paket sehr ähnlich, was die Struktur betrifft. Es ist im Grunde ein Zip Paket, das Ihre Anwendungsdateien und einige XML-Konfigurationsdateien enthält. Der Hauptunterschied, den MSIX mit sich brachte, ist seine erweiterte Unterstützung für Win32 Anwendungen, d.h. die Standard Desktop Anwendungen, die wir all die Jahre verwendet haben. Dies ermöglicht es, normale Desktop Anwendung zu verpacken und diese Zentral anzubieten und dabei alle neuen Vorteile der modernen Windows-APIs zu nutzen.
Genau wie vollständige UWP-Anwendungen können die Win32-konvertierten Anwendungen (als MSIX gepackt) auf die UWP-APIs zugreifen. Von einer Win32 Anwendung aus kann nur auf die Desktop-APIs zugegriffen werden, während aus einer vollständigen UWP Anwendung, auf verschiedene APIs (Mobile, Xbox, HoloLens, …) zugegriffen werden kann.
Voraussetzungen
- Citrix Virtual Apps & Desktop Umgebung
- Windows 10 (Minimum Version 2004 oder Insider Preview Version 19041 ) – Eine Maschine für die Erstellung der Pakete & die Maschinen für die Bereitstellung der Anwendungen
- Microsoft Active Directory Umgebung (Netzwerkfreigabe für die Skripte und die Pakete)
- Ein Internes oder Externes Zertifikat (Mit CN=Organisation Name)
File Server Freigabe
Für die MSIX App Attach Container erstellen wir einen Zentralen Ablage Punkt, von dem diese auch später gestartet werden können.
- Per mstsc auf den Fileserver aufschalten.
- Erstellt einen Ordner und gibt diesen frei (hier MSIX$)
- Wichtig ist das die Domänen Computer auch berechtigt sind auf die Freigabe zuzugreifen
Windows 10 Maschine für Paketerstellung
Wir bereiten eine separate Windows 10 Maschine vor um die MSIX Pakete, sowie die VHD/X Dateien zu erstellen. Hierfür benötigen wir mindestens die oben genannte Windows 10 Version und binden das System in unsere Active Directory Domäne ein.
Vorbereitung der Maschine
- Startet eine Administrative CMD
- Danach sollten die folgenden Befehle ausgeführt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
rem Disable Store auto update: reg add HKLM\Software\Policies\Microsoft\WindowsStore /v AutoDownload /t REG_DWORD /d 0 /f Schtasks /Change /Tn "\Microsoft\Windows\WindowsUpdate\Automatic app update" /Disable Schtasks /Change /Tn "\Microsoft\Windows\WindowsUpdate\Scheduled Start" /Disable rem Disable Content Delivery auto download apps that they want to promote to users: reg add HKCU\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager /v PreInstalledAppsEnabled /t REG_DWORD /d 0 /f reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Debug /v ContentDeliveryAllowedOverride /t REG_DWORD /d 0x2 /f rem Disable Windows Update: sc config wuauserv start=disabled |
Anmerkung! Um Skript basiert die leeren VHD/X Dateien zu erstellen und zu konfigurieren, wird auf der Maschine das Hyper-V Feature benötigt.
- Startet eine Administrative PowerShell
- Führt den folgenden Befehl aus.
1 |
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All |
Wenn dies nicht gewünscht ist, können die Schritte später auch manuell durchgeführt werden.
Selbst-signiertes Zertifikat
Für die späteren MSIX Pakete benötigen wir ein Internes oder Externes Zertifikat. Dieses muss dann mit dem Paket gebunden werden und auf den jeweiligen Zielrechnern im Certificate Store Local Machine\Trust People hinterlegt sein. In meiner Anleitung erstelle ein Selbst-signiertes Zertifikat, das ich dann per GPO oder WEM auf die Zielrechner verteilen kann.
- Startet eine Administrative PowerShell
- Führt den folgenden Befehl aus um ein Selbst-signiertes Zertifikat zu erhalten.
1 |
New-SelfSignedCertificate -Type Custom -Subject "CN=<Name der Organisation>" -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "cert:\LocalMachine\My" |
Beispiel:
1 |
New-SelfSignedCertificate -Type Custom -Subject "CN=CA-DEYDA" -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "cert:\LocalMachine\My" |
Da wir das Zertifikat nur in Certificate Store Local Machine\My oder Current User\My per Script ablegen können. Müssen wir das Zertifikat exportieren und in den richtigen Store importieren.
- Startet die MMC über Start > Ausführen und Eingabe von mmc. Bestätigt dies mit OK
- Klickt nun auf File > Add or Remove Snap-ins
- Im folgenden Menü Klickt auf Certificates und auf Add
- Wählt im folgenden Fenster Computer account aus und klickt auf Next.
- Bestätigt dies mit einem Klick auf Finish
- Klickt danach auf OK
- Geht unter Certificates (Local Computer) > Personal > Certificates auf das Zertifikat das erstellt wurde (hier CA-DEYDA).
- Rechts-Klick auf das Zertifikat und klickt auf All Tasks > Export
- Wählt den Punkt Yes, export the private key aus und klickt auf Next
- Wählt Personal Information Exchange – PKCS #12 (.PFX) aus. Beachtet das die unten angegebenen Punkte (Include all certificates in the certification path if possible / Enable certificate privacy) ebenfalls ausgewählt sind.
- Bestätigt dies mit Next
- Gebt im folgenden Fenster unter Password und Confirm password ein Passwort ein
- Bestätigt dies mit Next
- Klickt im folgenden Fenster auf Browse…
- Wählt ein Verzeichnis und einen Dateinamen aus (hier MSIXAppAttach.pfx) und klickt auf Save
- Bestätigt die Eingabe mit Next
- Bestätigt den Export im nächsten Fenster mit Finish
- Danach erfolgt die folgende Bestätigung
Anmerkung! Um die späteren Pakete auf der Maschine auszuführen zu können, muss das gerade erstellte Zertifikat unter Certificates (Local Computer) > Trusted People abgelegt werden.
- Öffnet hierfür nochmals die MMC Certificates für Local Computer auf dem Zielsystem
- Rechts-Klick auf den Ordner Trusted People und klickt dann auf All Tasks > Import…
- Klickt auf Next
- Klickt im folgenden Fenster auf Browse…
- Klickt neben File name auf die Dateitypen und wählt Personal Information Exchange aus
- Wählt nun das gerade erstellte Zertifikat aus (hier MSIXAppAttach.pfx) und klickt Open
- Bestätigt die Auswahl mit Next
- Gebt das hinterlegte Passwort unter Password ein und klickt auf Next
- Klickt im folgenden Fenster auf Place all certificates in the following store und klickt auf Browse…
- Wählt im folgenden Fenster Trusted People aus und bestätigt dies mit OK
- Schliesst den Import Prozess nun mit einem klick auf Finish ab
MSIX Packaging Tool
Nun können wir beginnen mit dem packen einer Applikation in ein MSIX Paket. Hierfür benötigen wir das MSIX Packaging Tool, da uns die Hersteller noch nicht viele MSIX Pakete anbieten und wir daher dies selber erstellen müssen.
- Ladet das Tool in der aktuellen Version von der Microsoft Seite herunter (oder die Insider Version von hier)
- Entpackt die Datei und startet die Installation
- Alternativ kann das Tool auch über den Microsoft Store installiert werden
- Startet das Tool nun mit Administrativen Rechten
- Bestätigt die Send diagnostic data Meldung
- Im eigentlichen Tool gibt es 3 verschiedene Tasks
- Application package – Hiermit kann aus einer Anwendung (z.B. msi oder exe Installer) ein Paket im MSIX-Format erstellt werden
- Modification package – Hiermit werden Modification package erstellt. Modification package sind MSIX Pakete, die Anpassungen oder Personalisierungen (z.B. Plugins oder Add-Ons) beinhalten
- Package editor – Hiermit können bestehende MSIX Pakete geöffnet werden, um seinen Inhalt oder seine Eigenschaften anzuzeigen und zu bearbeiten
- Über das angezeigte Zahnrad Symbol kann man die Einstellungen des Tools editieren
- Dort kann man für alle kommenden Pakete z.B. über Signing preference das benötigte Zertifikat hinterlegen und muss es so, nicht jedes mal beim erstellen eines Pakets auswählen
- Klickt nun auf Application package um ein neues Paket zu erstellen
- Wählt nun Create package on this computer aus und klickt auf Next
- Im nächsten Step (Prepare computer) wird das System auf eventuelle Inkompatibilitäten geprüft, in meinem Beispiel war z.B. noch Windows Search aktiv
- Wählt die Recommend action items aus und klickt auf Disable selected
- Bestätigt dies danach mit einem klick auf Next
- Klickt nun auf Browse… (Wenn das Zertifikat vorher nicht über Settings definiert wurde, muss dies auch noch hinterlegt werden)
- Klickt auf den Installer der in die MSIX Datei gepackt werden soll und auf Open
- Bestätigt die Eingaben mit Next
- Unter Package Information gebt die Informationen an die für das Paket angezeigt werden sollen, wenn es installiert ist.
- Package name: Die Bezeichnung der Anwendung.
- Package display name: Der Name der Anwendung, die dem Benutzer auf dem Startbildschirm angezeigt wird.
- Publisher name: Dieser Wert ist bereits ausgefüllt und schreibgeschützt, wenn im ersten Schritt ein Zertifikat angegeben wurde, das zum Signieren des Pakets verwendet werden soll.
- Publisher display name: Der Name des Herausgebers, der für den Benutzer sichtbar sein wird.
- Version: Die Versionsnummer der Anmeldung. Hier gibt es keine Regel, außer dass die letzte Ziffer immer Null sein muss und diese als solche nicht editierbar ist. Wenn eine Aktualisierung durchgeführt wird, denkt daran, dass dieser Wert höher sein muss als die Version des vorherigen Pakets, das erzeugt wurde.
- Installation location: Dies ist für Anwendungen gedacht, die über kein Installationsprogramm verfügen oder die nach dem Installationsprozess einige zusätzliche manuelle Schritte erfordern. Alle Dateien, die innerhalb dieses Ordners kopiert oder geändert werden, werden als Teil der Installationsphase erfasst und in das endgültige Paket aufgenommen. Dieses Feld ist besonders wichtig, wenn im ersten Schritt kein Installationsprogramm angegeben wurde. Hier können selbstausführbare Anwendung paketiert werden, indem einfach alle Dateien, aus denen diese besteht, in diesen Ordner kopiert werden.
- Klickt danach auf Next
Anmerkung! Wenn eine msi-Datei vorher ausgewählt wurde, werden diese Information aus der msi-Datei ausgelesen und automatisch hier hinterlegt (hier z.B. Microsoft Teams mit Machine Wide Installer Parameter). Dies kann dann noch editiert und personalisiert werden.
- Im folgenden Fenster startet der vorher ausgewählte Installer. Klickt diesen wie gewünscht durch.
- Die Installation der Anwendung wird durchgeführt und mit geschnitten
- Nach der Installation der Anwendung, kann über einen klick auf Restart das System neugestartet werden, falls die Anwendung dies benötigt. Nach diesem Neustart wird das MSIX Packaging Tool automatisch gestartet und kann an diesem Punkt fortgesetzt werden
- Wenn die Anwendung dies nicht benötigt, kann per Next der Prozess fortgesetzt werden
- Über Browse… können weitere Entry Points der Anwendung hinzugefügt werden
- Es folgt ein neues Fenster mit den weiteren möglichen Entry Points der installierten Anwendung. Wenn hier z.B. der erste Punkt mit der uninstall.exe ausgewählt wird, werden die dazugehörigen Registry Einträge und Dateien dem Paket hinzugefügt
- Wenn dies nicht gewünscht ist, klickt auf Next
- Bestätigt mit einem klick auf Yes, move on das die Anwendung nun vollständig installiert und konfiguriert ist
- Die aufgezeichneten Information werden daraufhin ausgewertet
- Im folgenden Services report werden die mit installierten Dienste angezeigt.
- Über die Auswahl der Dienste können diese dann aus dem Paket ausgeschlossen (Exclude selected services) oder eingeschlossen (Include selected services) werden
- Bestätigt die Auswahl danach mit Next
Anmerkung! Hier ein Beispiel (installiert wurde Google Chrome) einer Anwendung die auch Dienste installiert hat
- Unter Create package kann unter Save location der Speicherort für die MSIX Datei definiert werden
- Über den Punkt Package editor können die Daten, die in das MSIX Paket fließen, nochmals betrachtet und editiert werden
- Nach dem Klick auf Package editor hat man vier weitere Reiter zur Verfügung
Package information – Dieser Abschnitt kann dazu verwendet werden, die angezeigten Informationen der Anwendung zu ändern, z.B. durch einen anderen package name, publisher name usw. Wenn das Paket bei der Erstellung nicht signiert wurde, kann dies im Nachgang noch durchgeführt werden. Den Inhalt der XML Manifest Datei kann man ebenfalls prüfen, indem man auf die Schaltfläche Open file klickt. Man hat dann die Möglichkeit, Änderungen manuell vorzunehmen und diese zu speichern. Die aktualisierte Manifest Datei wird wieder in das Paket integriert.
Capabilities – In diesem Abschnitt werden alle verfügbaren Funktionen aufgelistet, auf die eine Anwendung zugreifen kann. Viele der angezeigten Funktionen sind aber nicht für Win32 Anwendungen zulässig, sondern gelten nur für UWP Anwendungen. Eine Ausnahme ist die Funktion Run as Administrator, diese kann auch von Win32 Anwendungen genutzt werden.
Virtual registry – In diesem Bereich können die .dat-Dateien untersucht werden, in denen die verschiedenen Registrierungsschlüssel gespeichert sind, die während des Bereitstellungsprozesses erstellt wurden sind. Aufgrund des virtualisierten Registrierungsansatzes, den der MSIX-Container bietet, sind diese Schlüssel bei der Installation der Anwendung nicht in der Systemregistrierung sichtbar. Daher ist es wichtig, alle noch erforderlichen Änderungen (Hinzufügen oder Löschen von Einträgen) in diesem Abschnitt vorzunehmen. Wenn mit der rechten Maustaste auf die verschiedenen Einträge in der Baumstruktur geklickt wird, hat man die Möglichkeit, Schlüssel und Werte hinzuzufügen, zu bearbeiten oder zu löschen.
Package files – Verwendet diesen Bereich, um alle Dateien zu untersuchen, die im Paket enthalten sind. Wie für den Abschnitt Virtual registry kann es hilfreich sein, nicht benötigte Dateien zu entfernen oder Dateien hinzuzufügen, die möglicherweise fehlen. Wenn mit der rechten Maustaste auf ein beliebiges Element im Baum geklickt wird, hat man die Möglichkeit, es zu löschen oder eine neue Datei am gleichen Ort hinzuzufügen.
- Jederzeit kann über Create das Paket erstellt werden
- Gebt den Namen des MSIX Pakets ein und bestätigt dies mit Save
- Nach dem erfolgreichen speichern erhält man die folgende Meldung
Erstellen des App Attach Container
Die folgenden Dinge können natürlich auch manuell durchgeführt werden, falls man das Hyper-V Feature nicht installieren möchten. Ich gehe aber im folgenden davon aus, das man dies doch lieber per Script löst.
Für die folgenden Schritte benötigt man aber auch noch das MSIX mgr Tool.
- Ladet das Tool herunter – Download hier
- Entpackt das Tool un kopiert die Dateien unterhalb der von euch benötigten Bit-Version in einen Pfad eurer Wahl (hier c:\MSIX)
Für die Erstellung und Konfiguration des Containers habe ich ein Script erstellt. Das Script erzeugt eine VHD oder VHDX Datei, mountet diese, erstellt eine Partition und formatiert diese. Danach wird unser parentFolder erstellt, das Volume erhält einen vernünftigen Namen und die Daten aus dem MSIX Paket werden rüber kopiert.
- Ladet das Script herunter und editiert es mit euren Eckdaten – Download hier
Im 0-PreStage Script müssen im oberen Bereich nur die Eckdaten definiert werden und dann führt das Script alle nötigen Schritte aus.
1 2 3 4 5 |
$vhdSrc="<path to vhd>" $packageName = "<package name>" $parentFolder = "<package parent folder>" $msixmgrPath = "<path to msixmgr.exe>" $msixPath = "<path to msix file>" |
Beispiel:
1 2 3 4 5 |
$vhdSrc="\\dc01.deyda.local\msix$\VLC2.vhdx" $packageName = "VLC_1.2.3.0_x64__z09f9srqzta18" $parentFolder = "MSIX" $msixmgrPath = "C:\MSIX\msixmgr" $msixPath = "C:\MSIX" |
Erklärung:
$vhdSrc – Zielpfad in dem die Container Datei (hier eine VHDX) abgelegt werden soll
$packageName – Name des Pakets das über MSIX Packaging Tool erstellt wurde
$parentFolder – Name des Ordners der im Container erstellt werden soll. Die MSIX Dateien dürfen nicht direkt im Root des Containers abgelegt werden. Hier kann natürlich auch der Paket Name oder ähnliches rein.
$msixmgrPath – Lokaler Pfad zum MSIX mgr Tool
$msixPath – Lokaler Pfad zum MSIX Paket
- Startet eine Administrative PowerShell
- Startet das editierte Script zum erstellen des MSIX App Attach Containers
- Für das nächste Script benötigt man die Informationen unter UniqueId (hier 9867f336-aca1-4bb9-8537-16c190388792) oder man führt bei gemounteten Container den Befehl mountvol aus. Dort notiert man die ID des angehängten Containers (hier Laufwerk E:\)
In dem MSIX Paket sind die folgenden Dateien vorhanden:
Assets – In diesem Ordner werden die Grafik Dateien der Anwendung gespeichert
VFS – Dieser Ordner enthält normalerweise die Binärdateien der Anwendung, DLLs, EXEs, Konfigurationsdateien und so weiter. Der VFS- und der Asset-Ordner werden auch als Nutzdaten der Anwendung bezeichnet.
Registry.dat – Diese Datei speichert die HKLM-Registrierungseinträge der Anwendung.
User.dat & User.Classes.dat – Diese Dateien enthalten die Registrierungseinträge pro Benutzer
Resources.pri – Diese Datei enthält Anwendungsressourcen, wie lokalisierte Zeichenfolgen und Pfade für zusätzliche Ressourcendateien. Die Pakete enthalten eine Datei pro Sprache.
AppxManifest.xml – Diese XML-Datei ist die Hauptressource des Pakets. Sie enthält alle Informationen, die das System zur Identifizierung, Installation und Ausführung der Anwendung benötigt.
AppxBlockMap.xml – Dies ist eine automatisch generierte Datei, die eine Liste aller Binärdateien der Anwendung und ihrer Hashes enthält. Sie wird vom System für Integritätsprüfungen und bei der Durchführung differenzieller Aktualisierungen verwendet.
AppxSignature.p7x – Diese Datei speichert die digitalen Signaturinformationen für den Paketinhalt.
PowerShell Skripte für Bereitstellung
Im Moment muss man die MSIX App Attach Container per Script mit den Zielsystem verbinden. Hierfür benötigt man 4 Skripte:
1-stage.ps1 – Hiermit wird der MSIX Container an das Zielsystem gemountet
1 2 3 4 |
$vhdSrc="<path to vhd>" $packageName = "<package name>" $parentFolder = "<package parent folder>" $volumeGuid = "<vol guid>" |
Beispiel:
1 2 3 4 |
$vhdSrc="\\dc01.deyda.local\msix$\VLC2.vhdx" $packageName = "VLC_1.2.3.0_x64__z09f9srqzta18" $parentFolder = "MSIX" $volumeGuid = "9867f336-aca1-4bb9-8537-16c190388792" |
Erklärung:
$vhdSrc – Zielpfad in dem die Container Datei (hier eine VHDX) abgelegt ist
$packageName – Name des Pakets das in dem Container abgelegt ist
$parentFolder – Name des Ordners der im Container erstellt wurde
$volumeGuid – Volume ID des Laufwerks
2-register.ps1 – Mit diesem Skript wird die Anwendung des gemounteten Containers im Benutzerkontext registriert
1 |
$packageName = "<package name>" |
Beispiel:
1 |
$packageName = "VLC_1.2.3.0_x64__z09f9srqzta18" |
Erklärung:
$packageName – Name des Pakets das in dem Container abgelegt ist
3-deregister.ps1 – Mit diesem Skript wird die Anwendung des gemounteten Containers im Benutzerkontext wieder getrennt
1 |
$packageName = "<package name>" |
Beispiel:
1 |
$packageName = "VLC_1.2.3.0_x64__z09f9srqzta18" |
Erklärung:
$packageName – Name des Pakets das in dem Container abgelegt ist
4-destage.ps1 – Hiermit wird der Container wieder getrennt
1 2 |
$packageName = "<package name>" $vhdSrc="<path to vhd>" |
Beispiel:
1 2 |
$packageName = "VLC_1.2.3.0_x64__z09f9srqzta18" $vhdSrc="\\dc01.deyda.local\msix$\VLC2.vhdx" |
Erklärung:
$packageName – Name des Pakets das in dem Container abgelegt ist
$vhdSrc – Zielpfad in dem die Container Datei (hier eine VHDX) abgelegt ist
Bereitstellung per MSIX App Attach
Die gerade erstellten Skripte müssen nun für den jeweiligen Benutzer ausgeführt werden. Dies kann z.B. durch GPO oder WEM Actions durchgeführt werden. In meinem Beispiel habe ich GPOs hierfür genutzt.
- Hierfür habe ich eine GPO erstellt, in der die beiden benötigten Skripte (1-Stage.ps1 & 2-Register.ps1) zum mounten der Anwendung eingeführt sind und die Berechtigung zum mounten der Container (Perform volume maintenance tasks) hinterlegt ist.
- Legt dort die Skripte unter Logon, als PowerShell Scripts ab
- Geht nun zum Pfad Computer Policy > Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment
- Fügt nun eine Benutzergruppe zur Einstellung Perform volume maintenance tasks hinzu (hier Domänen Benutzer).
- Das selbe sollte nochmals als Logoff Skript mit den jeweiligen 3-Deregister.ps1 und 4-Destage.ps1 Skript erstellt werden.
Ergebnis
Bevor die Skripte aktiviert wurde, war das Image leer.
Wenn sich ein Benutzer, nach der Aktivierung der GPOs anmeldet, werden die Skripte ausgeführt und der Benutzer kann die Anwendung nutzen, als wäre dies native installiert. Hier bei einem Start eines Windows 10 Desktop über Citrix.
Hier ist der editierte Package Name zu sehen (Google Chrome MSIX).