Testen von MSIX-Paketen für App Attach
In diesem Artikel erfahren Sie, wie Sie MSIX-Pakete außerhalb von Azure Virtual Desktop einbinden, um Ihre Pakete für App Attach zu testen. Die APIs, die App Attach unterstützen, sind für Windows 11 Enterprise und Windows 10 Enterprise verfügbar. Diese APIs können außerhalb von Azure Virtual Desktop zum Testen verwendet werden. Es gibt jedoch keine Verwaltungsebene für App Attach oder MSIX App Attach außerhalb von Azure Virtual Desktop.
Weitere Informationen zu App Attach und MSIX App Attach finden Sie unter App Attach und MSIX App Attach in Azure Virtual Desktop.
Voraussetzungen
Bevor Sie ein Paket testen können, um die Anweisungen in diesem Artikel zu befolgen, benötigen Sie die folgenden Dinge:
Ein Gerät mit Windows 11 Enterprise oder Windows 10 Enterprise.
Eine Anwendung, die Sie aus dem MSIX-Format zu einem Image erweitert haben, das Sie mit App Attach verwenden können. Erfahren Sie, wie Sie ein MSIX-Image erstellen, das mit App Attach in Azure Virtual Desktop verwendet werden kann.
Wenn Sie ein CimFS-Image verwenden, müssen Sie das PowerShell-Modul CimDiskImageinstallieren.
Ein Benutzerkonto, das über lokale Administratorberechtigungen auf dem Gerät verfügt, das Sie zum Testen des MSIX-Pakets verwenden.
Sie benötigen keine Azure Virtual Desktop-Bereitstellung, da in diesem Artikel ein Prozess zum Testen außerhalb von Azure Virtual Desktop beschrieben wird.
Hinweis
Der Microsoft-Support unterstützt das PowerShell-Modul CimDiskImage nicht, wenn also Probleme auftreten, müssen Sie eine Anforderung im GitHub-Repository des Moduls übermitteln.
Phasen
Um MSIX-Pakete außerhalb von Azure Virtual Desktop zu verwenden, müssen Sie vier verschiedene Phasen in der folgenden Reihenfolge ausführen:
- Phase
- Register
- Registrierung aufheben
- Staging aufheben
Staging und Aufheben des Stagings sind Vorgänge auf Computerebene, während das Registrieren und Aufheben der Registrierung Vorgänge auf Benutzerebene sind. Die Befehle, die Sie benötigen, hängen davon ab, welche Version von PowerShell Sie verwenden und ob Ihre Datenträgerimages im Format CimFS, VHDX oder VHD vorliegen.
Hinweis
Alle MSIX-Pakete enthalten ein Zertifikat. Sie müssen sicherstellen, dass die Zertifikate für MSIX-Pakete in Ihrer Umgebung vertrauenswürdig sind.
Vorbereiten zum Stagen eines MSIX-Pakets
Das Stagingskript bereitet Ihren Computer auf den Empfang des MSIX-Pakets vor und bindet das entsprechende Paket in Ihren Computer ein.
Wählen Sie die relevante Registerkarte für die von Ihnen verwendete PowerShell-Version aus.
Um Pakete mit PowerShell 6 oder höher zu stagen, müssen Sie die folgenden Befehle vor den Stagingvorgängen ausführen, um die Funktionen des Windows-Runtime-Pakets auf PowerShell zu übertragen.
Öffnen Sie als Administrator eine PowerShell-Eingabeaufforderung.
Führen Sie den folgenden Befehl aus, um das Windows-Runtime-Paket herunterzuladen und zu installieren. Sie müssen die folgenden Befehle nur einmal pro Computer ausführen.
#Required for PowerShell 6 and later $nuGetPackageName = 'Microsoft.Windows.SDK.NET.Ref' Register-PackageSource -Name MyNuGet -Location https://www.nuget.org/api/v2 -ProviderName NuGet Find-Package $nuGetPackageName | Install-Package
Führen Sie dann den folgenden Befehl aus, um die Windows-Runtime Komponenten in PowerShell verfügbar zu machen:
#Required for PowerShell 6 and later $nuGetPackageName = 'Microsoft.Windows.SDK.NET.Ref' $winRT = Get-Package $nuGetPackageName $dllWinRT = Get-ChildItem (Split-Path -Parent $winRT.Source) -Recurse -File WinRT.Runtime.dll $dllSdkNet = Get-ChildItem (Split-Path -Parent $winRT.Source) -Recurse -File Microsoft.Windows.SDK.NET.dll Add-Type -AssemblyName $dllWinRT.FullName Add-Type -AssemblyName $dllSdkNet.FullName
Stagen eines MSIX-Pakets
Nachdem Sie Ihren Computer für das Stagen von MSIX-Paketen vorbereitet haben, müssen Sie Ihr Datenträgerimage einbinden und dann das Staging Ihres MSIX-Pakets abschließen.
Einbinden eines Datenträgerimages
Der Prozess zum Einbinden eines Datenträgerimages hängt davon ab, ob Sie das Format CimFs, VHDX oder VHD für Ihr Datenträgerimage verwenden. Wählen Sie die relevante Registerkarte für das von Ihnen verwendete Format aus.
So binden Sie ein CimFS-Datenträgerimage ein:
Führen Sie in der gleichen PowerShell-Sitzung den folgenden Befehl aus:
$diskImage = "<Local or UNC path to the disk image>" $mount = Mount-CimDiskImage -ImagePath $diskImage -PassThru -NoMountPath #We can now get the Device Id for the mounted volume, this will be useful for the destage step. $deviceId = $mount.DeviceId Write-Output $deviceId
Behalten Sie die Variable
$deviceId
bei. Diese Informationen werden später in diesem Artikel benötigt.Wenn Sie fertig sind, fahren Sie fort mit Staging eines Datenträgerimages beenden.
Staging eines Datenträgerimages beenden
Schließlich müssen Sie die folgenden Befehle für alle Imageformate ausführen, um das Staging des Datenträgerimages abzuschließen. Dieser Befehl verwendet die $deviceId
-Variable, die Sie beim Einbinden Ihres Datenträgerimages im vorherigen Abschnitt erstellt haben.
Rufen Sie in derselben PowerShell-Sitzung die Anwendungsinformationen ab, indem Sie die folgenden Befehle ausführen:
$manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml $manifestFolder = $manifest.DirectoryName
Rufen Sie den vollständigen Namen des MSIX-Pakets ab, und speichern Sie ihn in einer Variablen, indem Sie die folgenden Befehle ausführen. Diese Variable wird für spätere Schritte benötigt.
$msixPackageFullName = $manifestFolder.Split('\')[-1] Write-Output $msixPackageFullName
Erstellen Sie einen absoluten URI für den Manifestordner für die Paket-Manager-API, indem Sie die folgenden Befehle ausführen:
$folderUri = $maniFestFolder.Replace('\\?\','file:\\\') $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
Verwenden Sie den absoluten URI, um das Anwendungspaket zu stagen, indem Sie die folgenden Befehle ausführen:
$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object { $_.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 = New-Object -TypeName Windows.Management.Deployment.PackageManager $asyncOperation = $packageManager.StagePackageAsync($folderAbsoluteUri, $null, "StageInPlace")
Überwachen Sie den Stagingfortschritt für das Anwendungspaket, indem Sie die folgenden Befehle ausführen. Die Zeit, die zum Stagen des Pakets benötigt wird, hängt von seiner Größe ab. Die
Status
-Eigenschaft der$stagingResult
-Variable wirdRanToCompletion
sein, wenn das Staging abgeschlossen ist.$stagingResult = $asTaskAsyncOperation.Invoke($null, @($asyncOperation)) while ($stagingResult.Status -eq "WaitingForActivation") { Write-Output "Waiting for activation..." Start-Sleep -Seconds 5 } Write-Output $stagingResult
Nachdem das Staging für Ihr MSI-Paket beendet ist, können Sie Ihr MSIX-Paket registrieren.
Registrieren eines MSIX-Pakets
Führen Sie zum Registrieren eines MSIX-Pakets die folgenden Befehle in derselben PowerShell-Sitzung aus. Dieser Befehl verwendet die $msixPackageFullName
-Variable, die in einem vorherigen Abschnitt erstellt wurde.
$manifestPath = Join-Path (Join-Path $Env:ProgramFiles 'WindowsApps') (Join-Path $msixPackageFullName AppxManifest.xml)
Add-AppxPackage -Path $manifestPath -DisableDevelopmentMode -Register
Da Ihr MSIX-Paket jetzt registriert ist, sollte Ihre Anwendung für die Verwendung in Ihrer Sitzung verfügbar sein. Sie können die Anwendung jetzt zum Testen und zur Problembehandlung öffnen. Nachdem Sie fertig sind, müssen Sie die Registrierung aufheben und das Staging Ihres MSIX-Pakets aufheben.
Aufheben der Registrierung eines MSIX-Pakets
Wenn Sie mit Ihrem MSIX-Paket fertig sind und es entfernen möchten, müssen Sie zunächst seine Registrierung aufheben. Führen Sie zum Aufheben der Registrierung des MSIX-Pakets die folgenden Befehle in derselben PowerShell-Sitzung aus. Diese Befehle rufen den Parameter DeviceId
des Datenträgers erneut ab und entfernen das Paket mithilfe der Variablen $msixPackageFullName
, die in einem vorherigen Abschnitt erstellt wurde.
$appPath = Join-Path (Join-Path $Env:ProgramFiles 'WindowsApps') $msixPackageFullName
$folderInfo = Get-Item $appPath
$deviceId = '\\?\' + $folderInfo.Target.Split('\')[0] +'\'
Write-Output $deviceId #Save this for later
Remove-AppxPackage $msixPackageFullName -PreserveRoamableApplicationData
Staging eines MSIX-Pakets aufheben
Um schließlich das Staging des MSIX-Pakets aufzuheben, müssen Sie die Bereitstellung ihres Datenträgerimages aufheben, den folgenden Befehl in derselben PowerShell-Sitzung ausführen, um sicherzustellen, dass das Paket für keine Benutzer*innen mehr registriert ist. Dieser Befehl verwendet die $msixPackageFullName
-Variable, die in einem vorherigen Abschnitt erstellt wurde.
Remove-AppxPackage -AllUsers -Package $msixPackageFullName -ErrorAction SilentlyContinue
Aufheben der Bereitstellung des Datenträgerimages
Um den Prozess zum Aufheben des Stagings abzuschließen, müssen Sie die Bereitstellung der Datenträger im System aufheben. Der Befehl, den Sie verwenden müssen, hängt vom Format Ihres Datenträgerimages ab. Wählen Sie die relevante Registerkarte für das von Ihnen verwendete Format aus.
Führen Sie zum Aufheben der Bereitstellung eines CimFS-Datenträgerimages die folgenden Befehle in derselben PowerShell-Sitzung aus:
Dismount-CimDiskImage -DeviceId $deviceId
Nachdem Sie die Bereitstellung Ihrer Datenträger aufgehoben haben, haben Sie Ihr MSIX-Paket sicher entfernt.
Einrichten von Simulationsskripts für den Agent für das Feature zum Anfügen von Apps
Wenn Sie MSIX-Pakete auf Ihrem Gerät automatisch hinzufügen und entfernen möchten, können Sie die PowerShell-Befehle in diesem Artikel verwenden, um Skripts zu erstellen, die beim Starten, Anmelden, Abmelden und Herunterfahren ausgeführt werden. Weitere Informationen finden Sie unter Verwenden von Skripts für Starten, Herunterfahren, Anmelden und Abmelden in der Gruppenrichtlinie. Sie müssen sicherstellen, dass alle für jede Phase erforderlichen Variablen in jedem Skript verfügbar sind.
Sie erstellen ein Skript für jede Phase:
- Das Startskript führt den Stagen-Prozess aus.
- Das Anmeldeskript führt den Registrieren-Prozess aus.
- Das Abmeldeskript führt den Prozess Aufheben der Registrierung aus.
- Das Skript zum Herunterfahren führt den Prozess zum Aufheben des Stagings aus.
Hinweis
Sie können den Aufgabenplaner verwenden, um das Skript für das Stagen auszuführen. Legen Sie zum Ausführen des Skripts den Aufgabenauslöser auf Beim Start des Computers fest, und aktivieren Sie Mit höchsten Privilegien ausführen.
Offlineverwendung von Paketen
Wenn Sie Pakete auf Geräten verwenden, die nicht mit dem Internet verbunden sind, müssen Sie sicherstellen, dass die Paketlizenzen auf Ihrem Gerät installiert sind, damit die App erfolgreich ausgeführt werden kann. Wenn Ihr Gerät online ist, sollten die erforderlichen Lizenzen automatisch heruntergeladen werden.
Um die Lizenzdateien zu installieren, müssen Sie ein PowerShell-Skript verwenden, das die MDM_EnterpriseModernAppManagement_StoreLicenses02_01
-Klasse im WMI-Brückenanbieter aufruft.
So richten Sie eine Lizenz für die Offlineverwendung ein:
Laden Sie das App-Paket, die Lizenzen und die erforderlichen Frameworks aus Microsoft Store für Unternehmen herunter. Sie benötigen sowohl die codierten als auch die nicht codierten Lizenzdateien. Informationen zum Herunterladen einer offline lizenzierten App finden Sie unter Verteilen von Offline-Apps.
Führen Sie die folgenden PowerShell-Befehle als Administrator aus. Sie können die Lizenz am Ende der Stagingphase installieren. Sie müssen die folgenden Variablen bearbeiten:
$contentID
ist der ContentID-Wert aus der nicht codierten Lizenzdatei (.xml
). Sie können die Lizenzdatei in einem Text-Editor Ihrer Wahl öffnen.$licenseBlob
ist die vollständige Zeichenfolge für das Lizenzblob in der codierten Lizenzdatei (.bin
). Sie können die codierte Lizenzdatei in einem Text-Editor Ihrer Wahl öffnen.$namespaceName = "root\cimv2\mdm\dmmap" $className = "MDM_EnterpriseModernAppManagement_StoreLicenses02_01" $methodName = "AddLicenseMethod" $parentID = "./Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses" #Update $contentID with the ContentID value from the unencoded license file (.xml) $contentID = "{'ContentID'_in_unencoded_license_file}" #Update $licenseBlob with the entire String in the encoded license file (.bin) $licenseBlob = "{Entire_String_in_encoded_license_file}" $session = New-CimSession #The final string passed into the AddLicenseMethod should be of the form <License Content="encoded license blob" /> $licenseString = '<License Content='+ '"' + $licenseBlob +'"' + ' />' $params = New-Object Microsoft.Management.Infrastructure.CimMethodParametersCollection $param = [Microsoft.Management.Infrastructure.CimMethodParameter]::Create("param",$licenseString ,"String", "In") $params.Add($param) try { $instance = New-CimInstance -Namespace $namespaceName -ClassName $className -Property @{ParentID=$parentID;InstanceID=$contentID} $session.InvokeMethod($namespaceName, $instance, $methodName, $params) } catch [Exception] { Write-Host $_ | Out-String }
Demonstrationsskripts
Sie finden Demonstrationsskripts für alle vier Stages des Testens von MSIX-Paketen und Syntaxhilfe für ihre Verwendung in unserem GitHub-Repository. Diese Skripts funktionieren mit jeder Version von PowerShell und jedem Datenträgerimageformat.
Nächste Schritte
Erfahren Sie mehr über App Attach und MSIX App Attach in Azure Virtual Desktop: