Michael Steiner

von Michael Steiner

MSIX App Attach – Express HowTo

MSIX App Attach – die Softwareverteilung der Zukunft?!

  • MSIX App Attach macht’s möglich: Softwareverteilung ganz ohne Dritt-Tool und ohne Kosten.

  • Und Softwareverteilung ganz ohne Softwareverteilung 😉

Mit App-V verfolgt Microsoft seit Jahren einen spannenden Weg, um Applikationen vom Betriebssystem getrennt zu pflegen und individuell bereitzustellen. Die Mehrwerte in der Systemarchitektur (weitgehend einheitliche Betriebssysteminstallationen für sämtliche Clients oder Terminalserver) und Administration (Anwendungsupdates jederzeit ohne die Endanwender zu beeinträchtigen und mit Fall-Back-Möglichkeit, …) sind einfach genial. Dennoch bringt App-V nach wie vor einige Einschränkungen mit (eingeschränkte Integration von Anwendungen ins Betriebssystem, Inkompatibilitäten, etc.), die einen durchgängigen Einsatz einschränken. Auf Basis der UWP-Plattform versucht Microsoft seit einiger Zeit immer mehr Anwendungen über den Microsoft Store bereitzustellen. Auch hier die Anwendungskapselung und für den User individuelle Bereitstellung von Anwendungen – losgelöst von der Betriebsplattform – unterstützt. Allerdings sind bisher nur wenige Softwarehersteller auf diese Bereitstellungsart umgestiegen.

Mit MSIX App Attach läutet Microsoft nun eine neue Ära ein und lässt beide Varianten verschmelzen. Anwendungen dynamisch anwenderbezogen zu publishen, die Anwendungsdaten dabei nur einmalig zentral bereitstellen und zur Unterstützung des Change-Release-Verfahrens auf Virtualisierungstechnologie zurückgreifen, die die Einschränkungen von App-V sprengt – jetzt wird es spannend!

Fazit: in MSIX steckt einiges Potential drin, die Softwarebereitstellung der Zukunft zu verändern – wenngleich noch ein paar Hürden zu nehmen sind.

PS: Die ersten Kunden profitieren bereits davon. – Lesen Sie mal rein.

PPS: Gerne stehen wir Ihnen für einen Austausch zur Verfügung und freuen uns auf Ihre Kontaktvereinbarung unter:https://s.modernx.de/ka

 

Mit der aktuellen Windows 10 Version (ab Build 2004) ist es nun möglich auch ohne spezielle Anpassungen MSIX App Attach zu nutzen, da Microsoft nun die MSIX APIs direkt eingebunden hat.

Im Vergleich zu traditionellen VDI Umgebungen mit deren klassischen Softwareverteilungen erlaubt uns MSIX App Attach Anwendungen außerhalb einer virtuellen Maschine in eine VHD(X) Datei zu speichern.

Was ist MSIX App Attach?

 

Das Prinzip von MSIX App Attach ist vergleichbar mit Microsoft Application Virtualisation (App-V), welches wir kennen und lieben. Hierbei liegen die Anwendungen zentral auf einem File-Server ab und werden an das jeweilige Windows Betriebssystem nur noch angebunden. Dabei ist die Anwendung nicht im Windows installiert, es sieht für den Anwender jedoch so aus. Damit erreichen wir eine klare Trennung von Betriebssystem und Anwendungen.

Für die Nutzung von MSIX Paketen benötigen wir für die Erstellung das MSIX Packaging Tool, falls noch keine MSIX Pakete zur Verfügung stehen und wir uns diese selbst erstellen wollen.

MSIX bietet uns hier die Möglichkeit verschiedene Arten von Installern (MSI, EXE, entpackte Anwendungen,…), bis hin zu schon fertig paketierten Microsoft App-V Paketen zu nutzen und diese in das MSIX Format zu überführen.

MSIX App Attach - die Nutzung

 

Das Anbinden und Trennen von MSIX App Attach Apps erfolgt aktuell mit einzelnen PowerShell Skripten, welche automatisch bei Start, Anmeldung, Abmeldung oder beim Herunterfahren ausgeführt werden.

Das Anbinden bei MSIX App Attach Apps erfolgt hier in zwei Phasen:

  • Staging

  • Register

 

Das Trennen erfolgt ebenfalls in zwei Phasen:

  • DeRegister

  • UnStage

 

Die Staging Phase bindet die virtuelle Festplatte (VHDX) an Windows an. In der Register Phase wird die eigentliche Anwendung dem Windows hinzugefügt, sodass es als installierte Anwendung erscheint. Die DeRegister und UnStage Phase entfernt die MSIX App Attach App aus Windows und trennt die Verbindung zur VHDX Datei.

 

Voraussetzungen

 

Achtung, da es sich hier um ein Express HowTo handelt, wird ein grundlegendes Verständnis von Windows, Active Directory & PowerShell vorausgesetzt.

Wir brauchen:

  • PowerShell KnowHow

  • Active Directory Umgebung

  • 2x Windows 10 (Build 2004) Domain-Joined (Paketier- & Test-Maschine)

  • 1x Netzwerk Datei-Freigabe

  • Ein internes oder externes Zertifikat (mit CN=OrgName)

  • MSIX Packaging Tool

  • MSIX Mgr Tool

 

Alle nachfolgenden PowerShell Skripte haben wir in ein Paket zusammengefasst und stehen nachfolgend zum Download bereit:


MSIX App Attach STARTER-KIT ZIP herunterladen • 2.27MB

 

Das PowerShell Skript „MSIX-GUI.ps1“ lässt sich über eine administrative PowerShell starten:

Zusätzlich gibt es jeden einzelnen Schritt auch als separates PowerShell Skript im Unterordner Scripts:

Zuvor sollten die Variablen mit Pfad-Angaben, Namen,… in der „MSIX-GUI.ps1“ an die jeweilige Umgebung angepasst werden:

Windows 10 Paketier-Maschine - Vorbereitungen

Die Paketier-Maschine benötigen wir um entsprechende MSIX Pakete, wie auch die VHDX Dateien, zu erstellen. Dabei sollte es sich hier um eine domain-joined Windows 10 (Build 2004) Maschine handeln.
Für die Paketier-Maschine benötigen wir gewisse Vorbereitungen. Diese wären das Deaktivieren der Windows Store Updates, das Auto Download von Apps, den Windows Update Dienst und für eine höhere Automatisierung benötigen wir die Hyper-V Features um die PowerShell Befehle „Mount-VHD“ und „Dismount-VHD“ verwenden zu können. Achtung, für die Hyper-V Features ist ein Neustart nötig!

Am besten nutzen wir hierfür eine administrative PowerShell Konsole:

 

 Write-Host "Disable Store auto update:"
New-Item -Path "HKLM:\Software\Policies\Microsoft\WindowsStore" -ErrorAction SilentlyContinue
 
New-ItemProperty -Path "HKLM:\Software\Policies\Microsoft\WindowsStore" -Name "AutoDownload" -PropertyType "DWord" -Value 0 -Force
Get-ScheduledTask -TaskPath "\Microsoft\Windows\WindowsUpdate\" -TaskName "Automatic app update" -ErrorAction SilentlyContinue | Disable-ScheduledTask -ErrorAction SilentlyContinue
Get-ScheduledTask -TaskPath "\Microsoft\Windows\WindowsUpdate\" -TaskName "Scheduled Start" -ErrorAction SilentlyContinue | Disable-ScheduledTask -ErrorAction SilentlyContinue
 
Write-Host "Disable Content Delivery auto download apps that they want to promote to users:" 
New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "PreInstalledAppsEnabled" -PropertyType "DWord" -Value 0 -Force
New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -ErrorAction SilentlyContinue
New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Debug" -ErrorAction SilentlyContinue
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Debug" -Name "ContentDeliveryAllowedOverride" -PropertyType "DWord" -Value 0x2 -Force
 
Write-Host "Disable Windows Update:"
Set-Service wuauserv -StartupType Disabled
 
Write-Host "Enable Hyper-V Features"
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
 
Write-Host "Restart needed!" -BackgroundColor Green 

 

 

Self-Signed Zertifikat

Um unsere MSIX Pakete zu signieren, benötigen wir ein entsprechendes Zertifikat. Für unser „MSIX Express HowTo“ bedienen wir uns erstmal eines Self-Signed Zertifikats, welches mit den MSIX Paketen gebündelt wird. Danach sollte das Zertifikat auf den jeweiligen Zielrechnern im Zertifikatsstore unter: „Local Machine\Trust People“ hinterlegt werden.

Zur Erstellung des Self-Signed Zertifikats nutzen wir eine administrative PowerShell Konsole:

 

 

$CertCN = "MST.intra"
 
New-SelfSignedCertificate -Type Custom -Subject "CN=<$CertCN>" -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(1)

 

 

Die Variable $CertCN ist mit dem eigenen Organisationsnamen auszufüllen.

Der Export des Self-Signed Zertifikats kann nun per MMC erfolgen (Start > Ausführen und Eingabe von certlm.msc). Unter „Certificates (Local Computer) à Personal à Certificates“ kann das Zertifikat exportiert werden. Hier wäre es das Zertifikat „MST.intra“.

Alternativ auch mit einer administrativen PowerShell Konsole:

 

$CertCN = "MST.intra”
$CertPWclear = "modernX2020“
$CertPW = ConvertTo-SecureString -String $CertPWclear -Force -AsPlainText
$CertExportPath = "C:\temp\MSIXCert\MSIXCert.pfx" 
 
Get-ChildItem -Path "Cert:\LocalMachine\my"| Where-Object {$_.Subject -eq "CN=$CertCN"} | Export-PfxCertificate -FilePath $CertExportPath -Password $CertPW -Verbose

 

 

 

Die Variablen $CertCN, $CertPWclear und $CertExportPath sind an die jeweilige Umgebung anzupassen.

 

 

Der Import des Zertifikats auf der Test-Maschine wird benötigt, um die späteren Pakete auf der Maschine ausführen zu können. Dazu muss das gerade erstellte Zertifikat unter Certificates (Local Computer) > Trusted People abgelegt werden.

Hierfür öffnen wir nochmals die Zertifikatskonsole (certlm.msc) für Local Computer auf dem Zielsystem:

Alternativ auch gerne wieder mit einer administrativen PowerShell Konsole:

 

 

$CertPWclear = "modernX2020“
$CertPW = ConvertTo-SecureString -String $CertPWclear -Force -AsPlainText
$CertImportPath = "C:\temp\MSIXCert\MSIXCert.pfx" 
 
Get-ChildItem -Path $CertImportPath | Import-PfxCertificate -CertStoreLocation "Cert:\LocalMachine\TrustedPeople" -Password $CertPW -Exportable 

 

 

 

Die Variablen $CertPWclear und $CertImportPath sind an die jeweilige Umgebung anzupassen.

 
File Server Freigabe

Wir benötigen die MSIX App Attach Apps (VHDX) einen zentralen Ablagepunkt, von welchem die fertigen MSIX App Attach Apps später auch an die Test-Maschine angebunden werden können.
Dafür erstellen wir einen Ordner und geben diesen frei (hier MSIX$). Domänen-Computer sollten hier auch Freigabe-Rechte erhalten!

(In den Folge-Beispielen bereitgestellt per DFS-N Pfad: \\mst.intra\dfs\MSIXAppAttach)

 

MSIX Packaging Tool

Um mit dem Paketieren von Anwendungen als MSIX zu beginnen, benötigen wir das MSIX Packaging Tool. Das Tool steht auf der Microsoft Seite zum Download zur Verfügung.

Es entpackt die Datei und startet die Installation auf der Paketier-Maschine:

Alternativ auch mit einer administrativen PowerShell Konsole:

 

Add-AppPackage -Path "C:\temp\Microsoft.MSIXPackagingTool\Microsoft.MsixPackagingTool_2019.1220.34.0_neutral___8wekyb3d8bbwe.Msixbundle" 

 

 

Das MSIX Packaging Tool enthält im Wesentlichen drei verschiedene Aufgaben:

  • Application package – Die eigentliche Erstellung von MSIX Paketen

  • Modification package – Erstellung von MSIX Paketen, welche Anpassungen oder Personalisierungen (Add-Ons,..) beinhalten.

  • Package editor – Bietet die Möglichkeit bestehende MSIX Pakete einzusehen und zu editieren.

Die Einstellungen sind über das obere, rechte Zahnrad zu erreichen.

Als „Komfort“-Möglichkeit wird hier das zuvor erstellte Zertifikat hinterlegt, sodass alle entstehenden MSIX Pakete damit signiert werden.

 

MSIX Paket-Erstellung

Für die Erstellung gehen wir den „Application package“ Wizard durch. In unserem Beispiel verwenden wir den VLC Media Player.

MSIX App Attach Container (VHDX) - Erstellung

Um aus dem fertigen MSIX Paket eine MSIX App Attach App zu bauen, benötigen wir noch das MSIX Mgr Tool (Download). Das Tool wird einfach auf der Paketier-Maschine entpackt:

Im Folgenden wird nun der VHDX Container erstellt und die fertige MSIX-Datei dorthin entpackt.

Damit dies automatisiert erfolgen kann, sollten die Hyper-V Features installiert sein (siehe Kapitel: Windows 10 Paketier-Maschine - Vorbereitungen).

Um diese Schritte nicht alle manuell ausführen zu müssen, gibt es hier folgendes PowerShell Skript.

Ausführung in einer administrativen PowerShell Konsole:

 

$MSIXVhdxSrc="\\mst.intra\dfs\MSIXAppAttach\VLC.VHDX" #Anpassen
$ParentFolder = "MSIX"
$MSIXmgrPath = "C:\temp\MSIX App Attach STARTER-KIT\MSIXmgr\x64" #Anpassen
$MSIXPath = "\\mst.intra\dfs\MSIXStore\" #Anpassen
$PackageName = "VLC-Player-3.0.11-x64_1.0.0.0_x64__cqfpzfs0pq22w" #Anpassen
$PackagePath = $MSIXPath + $PackageName + ".msix"
$Parts = $PackageName.split("_")
$VolumeName = "MSIX-" + $Parts[0]
 
 
#Generate a MSIX App Attach Container (VHDX) for MSIX
New-VHD -SizeBytes 2048MB -Path $MSIXVhdxSrc -Dynamic -Confirm:$false 
$VHDObject = Mount-VHD $MSIXVhdxSrc -Passthru
$Disk = Initialize-Disk -Passthru -Number $VHDObject.Number
$Partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $Disk.Number
Format-Volume -FileSystem NTFS -Confirm:$false -DriveLetter $Partition.DriveLetter -Force
$UniqueId = (Get-Volume -DriveLetter $($Partition.DriveLetter)).UniqueId
$Path = $Partition.DriveLetter + ":" + "\" + $ParentFolder
 
#Create a folder in root drive of the mounted VHDX
New-Item -Path $Path -ItemType Directory
Set-Volume -DriveLetter $Partition.DriveLetter -NewFileSystemLabel $VolumeName
 
#Expand MSIX
Set-Location $MSIXmgrPath
.\msixmgr.exe -Unpack -PackagePath $PackagePath -Destination $Path -ApplyACLs
 
#Show Unique ID
Write-Host "Unique ID: $UniqueId"

 

 

Die Ausführung des PowerShell Skriptes sollte in etwa so aussehen:

Das Endergebnis ist eine gemountete VHDX mit der entpackten MSIX App.

Im Beispiel der paketierte VLC Media Player:

Das PowerShell Skript zeigt uns auch die Unique ID der VHDX an, welche wir im späteren Verlauf benötigen werden:

Um die MSIX App Attach App wieder zu trennen, reicht es die VHDX wieder abzuhängen. Das geht manuell oder per PowerShell.
Ausführung in einer administrativen PowerShell Konsole:

 

#Detach VHDX
Dismount-VHD$MSIXVhdxSrc-Passthru 

 

 

Windows 10 Test-Maschine – Anhängen von MSIX App Attach Apps

Das Anhängen der MSIX App Attach Apps erfolgt in 2 Phasen: Staging und Register.
Typischerweise kann dies z.B.: bei der Anmeldung des Anwenders erfolgen.

Phase Staging
In dieser Phase wird die MSIX App Attach App mit unserer Test-Maschine verbunden.
Ausführung in einer administrativen PowerShell Konsole:

 

$MSIXVhdxSrc="\\mst.intra\dfs\MSIXAppAttach\VLC.VHDX"
$PackageName = "VLC-Player-3.0.11-x64_1.0.0.0_x64__cqfpzfs0pq22w"
$Parts = $PackageName.split("_")
$AppName = $Parts[0]
$VolumeName = "MSIX-" + $Parts[0]
$ParentFolder = "MSIX" 
$MSIXJunction = "C:\temp\AppAttach\" 
 
#Mount VHDX
try{
 Mount-Diskimage -ImagePath $MSIXVhdxSrc -NoDriveLetter -Access ReadOnly 
 Write-Host ("Mounting of " + $MSIXVhdxSrc + " was completed!") -BackgroundColor Green 
}catch{
 Write-Host ("Mounting of " + $MSIXVhdxSrc + " has failed!") -BackgroundColor Red
}
 
#Create Link
$msixDest = (Get-Volume | Where-Object {$_.FileSystemLabel -eq "$VolumeName"}).UniqueId
 
if(!(Test-Path $MSIXJunction)){
 New-Item -Path "C:\" -Name "temp" -ItemType "Directory" -ErrorAction SilentlyContinue
 New-Item -Path "C:\temp" -Name "AppAttach" -ItemType "directory" -ErrorAction SilentlyContinue
 Write-Host "Junction Point created!"
}
$MSIXJunction = $MSIXJunction + $PackageName
CMD /C "mklink /j $MSIXJunction $msixDest"
 
#Staging
[Windows.Management.Deployment.PackageManager,Windows.Management.Deployment,ContentType=WindowsRuntime] | Out-Null
Add-Type -AssemblyName System.Runtime.WindowsRuntime
 
$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where { $_.ToString() -eq 'System.Threading.Tasks.Task`1[TResult] AsTask[TResult,TProgress](Windows.Foundation.IAsyncOperationWithProgress`2[TResult,TProgress])'})[0]
$asTaskAsyncOperation = $asTask.MakeGenericMethod([Windows.Management.Deployment.DeploymentResult], [Windows.Management.Deployment.DeploymentProgress])
$packageManager = [Windows.Management.Deployment.PackageManager]::new()
$path = $MSIXJunction + "\" + $ParentFolder + "\" + $PackageName
$path = ([System.Uri]$path).AbsoluteUri
$asyncOperation = $packageManager.StagePackageAsync($path, $null, "StageInPlace") 
$task = $asTaskAsyncOperation.Invoke($null, @($asyncOperation))
$task 

 

 

Die Ausführung des PowerShell Skriptes sollte in etwa so aussehen:

Das Disk Management zeigt auf der Test-Maschine nun den MSIX App Attach Container an:

Der Junction Point in den Container liegt nun unter:

Phase Register

Nach der Phase Staging muss nun in der Phase Register die eigentliche Registrierung der MSIX App Attach App durchgeführt werden, sodass diese für den Anwender in Windows sichtbar wird.
Ausführung in einer administrativen PowerShell Konsole:

 

$PackageName = "VLC-Player-3.0.11-x64_1.0.0.0_x64__cqfpzfs0pq22w"
$WindowsAppsPath = "C:\Program Files\WindowsApps\" + $PackageName + "\AppxManifest.xml"
 

#Register
Add-AppxPackage -Path $WindowsAppsPath -DisableDevelopmentMode -Register 

 

 

Der Anwender sieht nun die MSIX App Attach App in seinem Startmenü:

Windows 10 Test-Maschine – Trennen von MSIX App Attach Apps

Das Trennen der MSIX App Attach Apps erfolgt ebenfalls in 2 Phasen: UnStaging und UnRegister.
Typischerweise kann dies z.B.: bei der Abmeldung des Anwenders erfolgen.

 

Phase UnRegister

Bei z.B. der Abmeldung des Anwenders wird hier im ersten Schritt die Anwendung aus dem Windows „entfernt“, indem die Registrierung zurückgezogen wird.
Ausführung in einer administrativen PowerShell Konsole:

 

 
$PackageName = "VLC-Player-3.0.11-x64_1.0.0.0_x64__cqfpzfs0pq22w"
 
#UnRegister
Remove-AppxPackage -PreserveRoamableApplicationData $PackageName 

 

 

Nach diesem Schritt ist die MSIX App Attach App nun nicht mehr für den Anwender sichtbar.

 

Phase UnStaging

Anschließend wird der MSIX App Attach Container von dem Windows-System getrennt. Indem erst die Verknüpfung (Junction Point) entfernt und danach die eigentliche VHDX getrennt wird.
Ausführung in einer administrativen PowerShell Konsole:

 

$PackageName = "VLC-Player-3.0.11-x64_1.0.0.0_x64__cqfpzfs0pq22w"
$MSIXVhdxSrc="\\mst.intra\dfs\MSIXAppAttach\VLC.VHDX"
$MSIXJunction = "C:\temp\AppAttach\"
 
#UnRegister AllUsers
Remove-AppxPackage -AllUsers -Package $PackageName
Set-Location $MSIXJunction 
Remove-Item $PackageName -Recurse -Force -Confirm:$false
 
#Dismount VHDX
Dismount-Diskimage -ImagePath $MSIXVhdxSrc 

 

 

Die Ausführung des PowerShell Skriptes sollte in etwa so aussehen:

Der Junction Point der MSIX App Attach App ist entfernt:

Der Container (VHDX) ist nun auch von dem Windows-System getrennt:

Bereitstellung MSIX App Attach per GPO

Eine Variante, um die MSIX App Attach App zu verteilen wäre z.B. per GPO. Hierfür nutzen wir die gerade verwendeten PowerShell Skripte. Diese verteilen wir in Verbindung mit unserem Zertifikat und dem Recht für Anwender, virtuelle Festplatten an das Windows anbinden zu dürfen.

Diese Gruppenrichtlinie ist als Beispiel gedacht:

Beratung anfordern

Lassen Sie uns gemeinsam Ihre IT neu denken

Prüfen Sie jetzt Ihr Potenzial zur IT-Kosteneinsparung oder buchen Sie direkt Ihren ersten Beratungstermin (kostenlos).

Vereinbaren Sie ein persönliches Beratungsgespräch oder fragen Sie ein konkretes Angebot an.