Freigeben über


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, mit denen App Attach verwendet wird, sind für Windows 11 Enterprise und Windows 10 Enterprise verfügbar. Diese APIs können außerhalb von Azure Virtual Desktop zu Testzwecken verwendet werden, es gibt jedoch keine Verwaltungsebene für App Attach außerhalb von Azure Virtual Desktop.

Weitere Informationen zu App Attach finden Sie unter 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 Folgendes:

Sie benötigen keine Azure Virtual Desktop-Bereitstellung, da in diesem Artikel ein Testprozess außerhalb von Azure Virtual Desktop beschrieben wird.

Hinweis

Microsoft-Support unterstützt das CimDiskImage-PowerShell-Modul 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 unterschiedliche Phasen in der folgenden Reihenfolge ausführen:

  1. Phase
  2. Registrieren
  3. Registrierung aufheben
  4. Bereitstellung aufheben

Staging und Destaging sind Vorgänge auf Computerebene, während registrierung und deregistering vorgänge auf Benutzerebene sind. Die befehle, die Sie verwenden müssen, variieren je nachdem, welche Version von PowerShell Sie verwenden und ob Ihre Datenträgerimages im CimFS-, VHDX - oder VHD-Format vorliegen.

Hinweis

Alle MSIX-Pakete enthalten ein Zertifikat. Sie sind dafür verantwortlich, sicherzustellen, dass die Zertifikate für MSIX-Pakete in Ihrer Umgebung vertrauenswürdig sind.

Vorbereiten der Bereitstellung eines MSIX-Pakets

Das Stagingskript bereitet Ihren Computer auf den Empfang des MSIX-Pakets vor und bindet das entsprechende Paket auf Ihrem Computer ein.

Wählen Sie die relevante Registerkarte für die version von PowerShell aus, die Sie verwenden.

Um Pakete mit PowerShell 6 oder höher zu stagingen, müssen Sie die folgenden Befehle vor den Stagingvorgängen ausführen, um die Funktionen des Windows-Runtime Pakets in PowerShell zu übertragen.

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

  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 als Nächstes 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
    

Bereitstellen eines MSIX-Pakets

Nachdem Sie Ihren Computer für die Bereitstellung 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 CimFs-, VHDX- oder VHD-Format für Ihr Datenträgerimage verwenden. Wählen Sie die relevante Registerkarte für das verwendete Format aus.

So binden Sie ein CimFS-Datenträgerimage ein:

  1. Führen Sie in derselben 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 $deviceIdbei. Sie benötigen diese Informationen weiter unten in diesem Artikel.

  3. Wenn Sie fertig sind, fahren Sie mit Fertigstellen des Stagings eines Datenträgerimages fort.

Beenden des Stagings eines Datenträgerimages

Abschließend müssen Sie die folgenden Befehle für alle Imageformate ausführen, um das Staging des Datenträgerimages abzuschließen. Dieser Befehl verwendet die Variable, die $deviceId 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 es 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 Stagingstatus für das Anwendungspaket, indem Sie die folgenden Befehle ausführen. Die Zeit, die zum Staging des Pakets benötigt wird, hängt von seiner Größe ab. Die Status -Eigenschaft der $stagingResult Variablen ist RanToCompletion , wenn die Stagingphase abgeschlossen ist.

    $stagingResult = $asTaskAsyncOperation.Invoke($null, @($asyncOperation))
    
    while ($stagingResult.Status -eq "WaitingForActivation") {
        Write-Output "Waiting for activation..."
        Start-Sleep -Seconds 5
    }
    
    Write-Output $stagingResult
    

Sobald Ihr MSI-Paket bereitgestellt wurde, 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 variable, die $msixPackageFullName 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

Nachdem Ihr MSIX-Paket registriert wurde, sollte Ihre Anwendung für die Verwendung in Ihrer Sitzung verfügbar sein. Sie können die Anwendung jetzt zu Test- und Problembehandlungszwecken öffnen. Sobald Sie fertig sind, müssen Sie die Registrierung ihres MSIX-Pakets aufheben und desentstellen.

Aufheben der Registrierung eines MSIX-Pakets

Sobald Sie mit dem MsIX-Paket fertig sind und bereit sind, es zu entfernen, müssen Sie die Registrierung zunächst aufheben. Führen Sie die folgenden Befehle in derselben PowerShell-Sitzung aus, um die Registrierung des MSIX-Pakets aufzuheben. Diese Befehle rufen den Parameter des Datenträgers DeviceId erneut ab und entfernen das Paket mithilfe der variablen, die $msixPackageFullName 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

Bereitstellen eines MSIX-Pakets

Um schließlich das MSIX-Paket zu entpacken, müssen Sie die Bereitstellung Ihres Datenträgerimages aufheben, indem Sie den folgenden Befehl in derselben PowerShell-Sitzung ausführen, um sicherzustellen, dass das Paket noch nicht für einen Benutzer registriert ist. Dieser Befehl verwendet die variable, die $msixPackageFullName in einem vorherigen Abschnitt erstellt wurde.

Remove-AppxPackage -AllUsers -Package $msixPackageFullName -ErrorAction SilentlyContinue

Aufheben der Bereitstellung des Datenträgerimages

Um den Destagingvorgang abzuschließen, müssen Sie die Bereitstellung der Datenträger aus dem 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 verwendete Format aus.

Führen Sie die folgenden Befehle in derselben PowerShell-Sitzung aus, um die Bereitstellung eines CimFS-Datenträgerimages auf heben:

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

Wenn Sie MSIX-Pakete automatisch zu Ihrem Gerät 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 Start-, Herunterfahren-, Anmelde- und Abmeldeskripts in Gruppenrichtlinie. Sie müssen sicherstellen, dass alle variablen, die für jede Phase erforderlich sind, in jedem Skript verfügbar sind.

Sie erstellen ein Skript für jede Phase:

  • Das Startskript führt den Phasenprozess aus.
  • Das Anmeldeskript führt den Registrierungsprozess aus.
  • Das Abmeldungsskript führt den Registrierungsprozess aus.
  • Das Skript zum Herunterfahren führt den Destageprozess aus.

Hinweis

Sie können den Aufgabenplaner verwenden, um das Phasenskript auszuführen. Legen Sie zum Ausführen des Skripts den Tasktrigger auf Beim Starten des Computers fest, und aktivieren Sie Ausführen mit den höchsten Berechtigungen.

Offline verwenden 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, um die App erfolgreich ausführen zu können. Wenn Ihr Gerät online ist, sollten die erforderlichen Lizenzen automatisch heruntergeladen werden.

Zum Installieren der Lizenzdateien müssen Sie ein PowerShell-Skript verwenden, das die MDM_EnterpriseModernAppManagement_StoreLicenses02_01 -Klasse im WMI-Bridge-Anbieter aufruft.

So richten Sie eine Lizenz für die Offlineverwendung ein:

  1. Laden Sie das App-Paket, die Lizenz und die erforderlichen Frameworks aus dem 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 gesamte 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

Demoskripts für alle vier Phasen des Testens von MSIX-Paketen und Syntaxhilfe für deren Verwendung finden Sie in unserem GitHub-Repository. Diese Skripts können mit jeder Version von PowerShell und einem beliebigen Datenträgerimageformat verwendet werden.

Nächste Schritte

Erfahren Sie mehr über App Attach in Azure Virtual Desktop: