MSIX App Attach mit Windows 10 Version 2004 in einer Citrix Umgebung

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 App Attach

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.

MSIX Components

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$)
File Server share
  • Wichtig ist das die Domänen Computer auch berechtigt sind auf die Freigabe zuzugreifen
Permissions for share
Folder properties

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
Command Prompt Run as Administrator
  • Danach sollten die folgenden Befehle ausgeführt werden:
Disable Store auto update Disable Content Delivery Disable Windows Update

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
Windows PowerShell Run as Administrator
  • Führt den folgenden Befehl aus.
Enable Windows Feature Microsoft Hyper-V

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
Windows PowerShell Run as Administrator
  • Führt den folgenden Befehl aus um ein Selbst-signiertes Zertifikat zu erhalten.

Beispiel:

New-SelfSignedCertificate PowerShell

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
Run mmc
  • 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
Certificates snap-in Computer account
  • Klickt danach auf OK
Add or Remove Snap-ins Certificates (Local Computer)
  • 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
Certificates (Local Computer) Personal Certificates All Tasks Export
  • Wählt den Punkt Yes, export the private key aus und klickt auf Next
Export Private Key Certificate Export Wizard Yes, export the private key
  • 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
Export File Format Personal Information Exchange - PKCS #12 (.PFX) Include all certificates in the certification path if possible Enable certificate privacy
  • Gebt im folgenden Fenster unter Password und Confirm password ein Passwort ein
  • Bestätigt dies mit Next
Security Password Confirm password
  • Klickt im folgenden Fenster auf Browse…
  • Wählt ein Verzeichnis und einen Dateinamen aus (hier MSIXAppAttach.pfx) und klickt auf Save
Save as Personal Information Exchange
  • Bestätigt die Eingabe mit Next
File to Export
  • Bestätigt den Export im nächsten Fenster mit Finish
Completing the Certificate Export Wizard
  • Danach erfolgt die folgende Bestätigung
Certificate Export Wizard

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…
MMC Certificates Trusted People All Tasks Import
  • Klickt auf Next
Certificate Import Wizard
  • 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
File name Personal Information Exchange
  • Bestätigt die Auswahl mit Next
File to Import
  • Gebt das hinterlegte Passwort unter Password ein und klickt auf Next
Private key protection
  • 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
Certificate Store
  • Schliesst den Import Prozess nun mit einem klick auf Finish ab
Completing the Certificate Import Wizard

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)
Download MSIX Packaging Tool
  • Entpackt die Datei und startet die Installation
Install MSIX Packaging Tool
  • Alternativ kann das Tool auch über den Microsoft Store installiert werden
Microsoft Store Get MSIX Packaging Tool
  • 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
Application package Modification package Package editor
  • 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
MSIX Packaging Tool Settings
  • Klickt nun auf Application package um ein neues Paket zu erstellen
MSIX Packaging Tool Application package
  • Wählt nun Create package on this computer aus und klickt auf Next
Create package on this computer
  • 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
Prepare computer Additional preparations Recommend action items
  • Klickt nun auf Browse… (Wenn das Zertifikat vorher nicht über Settings definiert wurde, muss dies auch noch hinterlegt werden)
Choose the installer you want to package
  • Klickt auf den Installer der in die MSIX Datei gepackt werden soll und auf Open
  • Bestätigt die Eingaben mit Next
Open Installer
  • 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
Package information

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.

Package information Create new package MSI
  • Im folgenden Fenster startet der vorher ausgewählte Installer. Klickt diesen wie gewünscht durch.
Installation Installer
  • Die Installation der Anwendung wird durchgeführt und mit geschnitten
Installation Installer MSIX
  • 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
Installation Restart
  • Über Browse… können weitere Entry Points der Anwendung hinzugefügt werden
Manage first launch tasks
  • 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
Add entry points
  • Bestätigt mit einem klick auf Yes, move on das die Anwendung nun vollständig installiert und konfiguriert ist
Are you done? Yes, move on
  • Die aufgezeichneten Information werden daraufhin ausgewertet
Services Report Preparing your package
  • 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
Services report Create new package

Anmerkung! Hier ein Beispiel (installiert wurde Google Chrome) einer Anwendung die auch Dienste installiert hat

Create new package Services report
  • 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.

Package editor Package information

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 editor Virtual registry

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.

Package editor Package files
  • Jederzeit kann über Create das Paket erstellt werden
  • Gebt den Namen des MSIX Pakets ein und bestätigt dies mit Save
Save as MSIX
MSIX Packaging Tool Saving your changes
  • Nach dem erfolgreichen speichern erhält man die folgende Meldung
Package succesfully created

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.

MSIX mgr Tool
  • Entpackt das Tool un kopiert die Dateien unterhalb der von euch benötigten Bit-Version in einen Pfad eurer Wahl (hier c:\MSIX)
Sub Folder msix mgr tool

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.

Script for MSIX
  • 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.

Beispiel:

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
new-vhd -sizebytes 1024MB
Mount-VHD -Passthru
  • 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:\)
mountvol

In dem MSIX Paket sind die folgenden Dateien vorhanden:

Assets – In diesem Ordner werden die Grafik Dateien der Anwendung gespeichert

Assets

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.

VFS

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.

MSIX Container

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-Stage.ps1

Beispiel:

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

1-Stage.ps1 succesfully

2-register.ps1 – Mit diesem Skript wird die Anwendung des gemounteten Containers im Benutzerkontext registriert

2-Register.ps1

Beispiel:

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

3-Deregister.ps1

Beispiel:

Erklärung:
$packageName – Name des Pakets das in dem Container abgelegt ist

4-destage.ps1 – Hiermit wird der Container wieder getrennt

4-Destage.ps1

Beispiel:

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.
GPO deploy MSIX
  • Legt dort die Skripte unter Logon, als PowerShell Scripts ab
GPO PowerShell Scripts
  • Geht nun zum Pfad Computer Policy > Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment
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).
Perform volume maintenance tasks
  • 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.

Empty Startmenu

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.

MSIX App Attach in Citrix
VLC native

Hier ist der editierte Package Name zu sehen (Google Chrome MSIX).

Package Name