Testare i pacchetti MSIX per il collegamento di app

Questo articolo illustra come montare pacchetti MSIX all'esterno di Desktop virtuale Azure per testare i pacchetti per il collegamento di app. Le API che power app attach sono disponibili per Windows 11 Enterprise e Windows 10 Enterprise. Queste API possono essere usate all'esterno di Desktop virtuale Azure per i test, ma non esiste alcun piano di gestione per msiX app attach o collegamento app all'esterno di Desktop virtuale Azure.

Per altre informazioni sul collegamento alle app MSIX e sul collegamento di app, vedere MsiX app attach e app attach in Desktop virtuale Azure.

Prerequisiti

Prima di poter testare un pacchetto per seguire le istruzioni riportate in questo articolo, sono necessari gli elementi seguenti:

  • Un dispositivo che esegue Windows 11 Enterprise o Windows 10 Enterprise.

  • Un'applicazione espansa dal formato MSIX in un'immagine che è possibile usare con app attach. Informazioni su come creare un'immagine MSIX da usare con il collegamento di app in Desktop virtuale Azure.

  • Se si usa un'immagine CimFS, è necessario installare il modulo PowerShell CimDiskImage.

  • Un account utente con autorizzazione di amministratore locale per il dispositivo usato per testare il pacchetto MSIX.

Non è necessaria una distribuzione di Desktop virtuale Azure perché questo articolo descrive un processo per il test all'esterno di Desktop virtuale Azure.

Nota

supporto tecnico Microsoft non supporta il modulo PowerShell CimDiskImage. Se si verificano problemi, è necessario inviare una richiesta nel repository GitHub del modulo.

Phases

Per usare pacchetti MSIX all'esterno di Desktop virtuale Azure, è necessario eseguire quattro fasi distinte nell'ordine seguente:

  1. Fase
  2. Registrazione
  3. Annullamento registrazione
  4. Rimozione gestione temporanea

La gestione temporanea e la destaging sono operazioni a livello di computer, mentre la registrazione e la deregistrazione sono operazioni a livello di utente. I comandi da usare variano in base alla versione di PowerShell in uso e al fatto che le immagini del disco si trovino in formato CimFS, VHDX o VHD .

Nota

Tutti i pacchetti MSIX includono un certificato. È necessario assicurarsi che i certificati per i pacchetti MSIX siano considerati attendibili nell'ambiente in uso.

Preparare l'esecuzione di un pacchetto MSIX

Lo script di staging prepara il computer a ricevere il pacchetto MSIX e monta il pacchetto pertinente nel computer.

Selezionare la scheda pertinente per la versione di PowerShell in uso.

Per preparare i pacchetti usando PowerShell 6 o versione successiva, è necessario eseguire i comandi seguenti prima delle operazioni di gestione temporanea per portare le funzionalità del pacchetto Windows Runtime in PowerShell.

  1. Aprire un prompt di PowerShell come amministratore.

  2. Eseguire il comando seguente per scaricare e installare il pacchetto Windows Runtime. È necessario eseguire i comandi seguenti una sola volta per ogni computer.

    #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. Eseguire quindi il comando seguente per rendere disponibili i componenti Windows Runtime in PowerShell:

    #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
    

Preparare un pacchetto MSIX

Ora che il computer è stato preparato per preparare i pacchetti MSIX, è necessario montare l'immagine del disco, quindi completare la gestione temporanea del pacchetto MSIX.

Montare un'immagine del disco

Il processo di montaggio di un'immagine disco varia a seconda che si usi il formato CimFs, VHDX o VHD per l'immagine del disco. Selezionare la scheda pertinente per il formato in uso.

Per montare un'immagine del disco CimFS:

  1. Nella stessa sessione di PowerShell eseguire il comando seguente:

    $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. Mantenere la variabile $deviceId. Queste informazioni saranno necessarie più avanti in questo articolo.

  3. Al termine, passare a Completare la gestione temporanea di un'immagine del disco.

Completare la gestione temporanea di un'immagine del disco

Infine, è necessario eseguire i comandi seguenti per tutti i formati di immagine per completare la gestione temporanea dell'immagine del disco. Questo comando usa la $deviceId variabile creata quando è stata montata l'immagine del disco nella sezione precedente.

  1. Nella stessa sessione di PowerShell recuperare le informazioni sull'applicazione eseguendo i comandi seguenti:

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. Ottenere il nome completo del pacchetto MSIX e archiviarlo in una variabile eseguendo i comandi seguenti. Questa variabile è necessaria per i passaggi successivi.

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. Creare un URI assoluto per la cartella manifesto per l'API Gestione pacchetti eseguendo i comandi seguenti:

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. Usare l'URI assoluto per preparare il pacchetto dell'applicazione eseguendo i comandi seguenti:

    $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. Monitorare lo stato di avanzamento della gestione temporanea per il pacchetto dell'applicazione eseguendo i comandi seguenti. Il tempo necessario per preparare il pacchetto dipende dalle dimensioni. La Status proprietà della $stagingResult variabile sarà RanToCompletion al termine della gestione temporanea.

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

Dopo aver eseguito lo staging del pacchetto MSI, è possibile registrare il pacchetto MSIX.

Registrare un pacchetto MSIX

Per registrare un pacchetto MSIX, eseguire i comandi seguenti nella stessa sessione di PowerShell. Questo comando usa la $msixPackageFullName variabile creata in una sezione precedente.

$manifestPath = Join-Path (Join-Path $Env:ProgramFiles 'WindowsApps') (Join-Path $msixPackageFullName AppxManifest.xml)
Add-AppxPackage -Path $manifestPath -DisableDevelopmentMode -Register

Ora che il pacchetto MSIX è registrato, l'applicazione deve essere disponibile per l'uso nella sessione. È ora possibile aprire l'applicazione per il test e la risoluzione dei problemi. Al termine, è necessario annullare la registrazione e destagare il pacchetto MSIX.

Annullare la registrazione di un pacchetto MSIX

Dopo aver completato il pacchetto MSIX e averla rimossa, è prima necessario annullare la registrazione. Per annullare la registrazione del pacchetto MSIX, eseguire i comandi seguenti nella stessa sessione di PowerShell. Questi comandi recuperano di nuovo il parametro del DeviceId disco e rimuovono il pacchetto usando la $msixPackageFullName variabile creata in una sezione precedente.

$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

Destage un pacchetto MSIX

Infine, per destagare il pacchetto MSIX, è necessario smontare l'immagine del disco, eseguire il comando seguente nella stessa sessione di PowerShell per assicurarsi che il pacchetto non sia ancora registrato per alcun utente. Questo comando usa la $msixPackageFullName variabile creata in una sezione precedente.

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

Smontare l'immagine dei dischi

Per completare il processo di destaging, è necessario smontare i dischi dal sistema. Il comando da usare dipende dal formato dell'immagine del disco. Selezionare la scheda pertinente per il formato in uso.

Per smontare un'immagine del disco CimFS, eseguire i comandi seguenti nella stessa sessione di PowerShell:

Dismount-CimDiskImage -DeviceId $deviceId

Dopo aver smontato i dischi, il pacchetto MSIX è stato rimosso in modo sicuro.

Configurare script di simulazione per l'agente di connessione all'app MSIX

Per aggiungere e rimuovere automaticamente pacchetti MSIX nel dispositivo, è possibile usare i comandi di PowerShell in questo articolo per creare script eseguiti all'avvio, all'accesso, alla disconnessione e all'arresto. Per altre informazioni, vedere Uso di script di avvio, arresto, accesso e disconnessione in Criteri di gruppo. È necessario assicurarsi che tutte le variabili necessarie per ogni fase siano disponibili in ogni script.

Si crea uno script per ogni fase:

  • Lo script di avvio esegue il processo di fase .
  • Lo script di accesso esegue il processo di registrazione .
  • Lo script di disconnessione esegue il processo di annullamento della registrazione .
  • Lo script di arresto esegue il processo di destage .

Nota

È possibile usare l'utilità di pianificazione per eseguire lo script di fase. Per eseguire lo script, impostare il trigger dell'attività su All'avvio del computer e abilitare Esegui con privilegi più elevati.

Usare pacchetti offline

Se usi pacchetti dal Microsoft Store per le aziende o dal Microsoft Store per la formazione nei dispositivi che non sono connessi a Internet, devi ottenere le licenze del pacchetto da Microsoft Store e installarle nel dispositivo per eseguire correttamente l'app. Se il dispositivo è online e può connettersi alla Microsoft Store per le aziende, le licenze necessarie devono essere scaricate automaticamente, ma se si è offline, è necessario configurare manualmente le licenze.

Per installare i file di licenza, è necessario usare uno script di PowerShell che chiama la MDM_EnterpriseModernAppManagement_StoreLicenses02_01 classe nel provider bridge WMI.

Ecco come configurare una licenza per l'uso offline:

  1. Scaricare il pacchetto, la licenza e i framework necessari dall'Microsoft Store per le aziende. Sono necessari sia il file di licenza codificato che quello non codificato. Per informazioni su come scaricare un'app con licenza offline, vedere Distribuire app offline.

  2. Eseguire i comandi di PowerShell seguenti come amministratore. È possibile installare la licenza alla fine della fase di gestione temporanea. È necessario modificare le variabili seguenti:

    • $contentID è il valore ContentID del file di licenza non codificato (.xml). Il file di licenza può essere aperto in un editor di testo di propria scelta.

    • $licenseBlob è l'intera stringa per il BLOB di licenze nel file di licenza codificato (.bin). Il file di licenza codificato può essere aperto in un editor di testo di propria scelta.

      $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
      }
      

Script dimostrativi

È possibile trovare script dimostrativi per tutte e quattro le fasi del test dei pacchetti MSIX e della sintassi per informazioni su come usarli nel repository GitHub. Questi script funzionano con qualsiasi versione di PowerShell e qualsiasi formato di immagine del disco.

Passaggi successivi

Altre informazioni sul collegamento alle app MSIX e sul collegamento di app in Desktop virtuale Azure: