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:

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:

  1. Phase
  2. Register
  3. Registrierung aufheben
  4. 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.

  1. Öffnen Sie als Administrator eine PowerShell-Eingabeaufforderung.

  2. 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
    
  3. 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:

  1. 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
    
  2. Behalten Sie die Variable $deviceId bei. Diese Informationen werden später in diesem Artikel benötigt.

  3. 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.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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")
    
  5. Ü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 wird RanToCompletion 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:

  1. 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.

  2. 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: