Partager via


Tester des packages MSIX pour App Attach

Cet article explique comment monter des packages MSIX en dehors d’Azure Virtual Desktop pour tester vos packages pour App Attach. Les API qui alimentent App Attach sont disponibles pour Windows 11 Entreprise et Windows 10 Entreprise. Ces API peuvent être utilisées en dehors d’Azure Virtual Desktop à des fins de test, mais il n’existe aucun plan de gestion pour App Attach en dehors d’Azure Virtual Desktop.

Pour plus d’informations sur App Attach, consultez App Attach in Azure Virtual Desktop.

Configuration requise

Avant de pouvoir tester un package pour suivre les instructions de cet article, vous avez besoin des éléments suivants :

Vous n’avez pas besoin d’un déploiement Azure Virtual Desktop, car cet article décrit un processus de test en dehors d’Azure Virtual Desktop.

Remarque

Support Microsoft ne prend pas en charge le module PowerShell CimDiskImage. Par conséquent, si vous rencontrez des problèmes, vous devez envoyer une demande sur le référentiel GitHub du module.

Étapes

Pour utiliser des packages MSIX en dehors d’Azure Virtual Desktop, vous devez effectuer quatre phases distinctes dans l’ordre suivant :

  1. Phase
  2. Inscrire
  3. Désinscrire
  4. Retirer de l’étape intermédiaire

La préproduction et le détaging sont des opérations au niveau de l’ordinateur, tandis que l’inscription et la désinscription sont des opérations au niveau de l’utilisateur. Les commandes que vous devez utiliser varient en fonction de la version de PowerShell que vous utilisez et si vos images disque sont au format CimFS, VHDX ou VHD .

Remarque

Tous les packages MSIX incluent un certificat. Il vous incombe de vous assurer que les certificats pour les packages MSIX sont approuvés dans votre environnement.

Préparer l’étape d’un package MSIX

Le script intermédiaire prépare votre machine à recevoir le package MSIX et monte le package approprié sur votre ordinateur.

Sélectionnez l’onglet approprié pour la version de PowerShell que vous utilisez.

Pour mettre en lots des packages à l’aide de PowerShell 6 ou version ultérieure, vous devez exécuter les commandes suivantes avant les opérations intermédiaires afin d’intégrer les fonctionnalités du package Windows Runtime à PowerShell.

  1. Ouvrez une invite PowerShell en tant qu’administrateur.

  2. Exécutez la commande suivante pour télécharger et installer le package Windows Runtime. Vous ne devez exécuter les commandes suivantes qu’une seule fois par machine.

    #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. Ensuite, exécutez la commande suivante pour rendre les composants Windows Runtime disponibles dans 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
    

Mettre en scène un package MSIX

Maintenant que vous avez préparé votre machine pour la mise en phase des packages MSIX, vous devez monter votre image disque, puis terminer la mise en lots de votre package MSIX.

Monter une image disque

Le processus de montage d’une image disque varie selon que vous utilisez le format CimFs, VHDX ou VHD pour votre image disque. Sélectionnez l’onglet approprié pour le format que vous utilisez.

Pour monter une image de disque CimFS :

  1. Dans la même session PowerShell, exécutez la commande suivante :

    $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. Conservez la variable $deviceId. Vous avez besoin de ces informations plus loin dans cet article.

  3. Lorsque vous avez terminé, passez à Terminer la mise en lots d’une image disque.

Terminer la mise en lots d’une image disque

Enfin, vous devez exécuter les commandes suivantes pour tous les formats d’image afin d’effectuer la mise en lots de l’image disque. Cette commande utilise la $deviceId variable que vous avez créée lorsque vous avez monté votre image disque dans la section précédente.

  1. Dans la même session PowerShell, récupérez les informations de l’application en exécutant les commandes suivantes :

    $manifest = Get-ChildItem -LiteralPath $deviceId -Recurse -File AppxManifest.xml
    $manifestFolder = $manifest.DirectoryName
    
  2. Obtenez le nom complet du package MSIX et stockez-le dans une variable en exécutant les commandes suivantes. Cette variable est nécessaire pour les étapes ultérieures.

    $msixPackageFullName = $manifestFolder.Split('\')[-1]
    Write-Output $msixPackageFullName
    
  3. Créez un URI absolu pour le dossier manifeste de l’API gestionnaire de package en exécutant les commandes suivantes :

    $folderUri = $maniFestFolder.Replace('\\?\','file:\\\')
    $folderAbsoluteUri = ([Uri]$folderUri).AbsoluteUri
    
  4. Utilisez l’URI absolu pour mettre en scène le package d’application en exécutant les commandes suivantes :

    $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. Surveillez la progression du package d’application en exécutant les commandes suivantes. Le temps nécessaire à l’étape du package dépend de sa taille. La Status propriété de la $stagingResult variable sera RanToCompletion une fois la mise en lots terminée.

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

Une fois que votre package MSI est intermédiaire, vous pouvez inscrire votre package MSIX.

Inscrire un package MSIX

Pour inscrire un package MSIX, exécutez les commandes suivantes dans la même session PowerShell. Cette commande utilise la $msixPackageFullName variable créée dans une section précédente.

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

Maintenant que votre package MSIX est inscrit, votre application doit être disponible pour une utilisation dans votre session. Vous pouvez maintenant ouvrir l’application à des fins de test et de résolution des problèmes. Une fois que vous avez terminé, vous devez désinscrire et désinstaurer votre package MSIX.

Désinscrire un package MSIX

Une fois que vous avez terminé avec votre package MSIX et que vous êtes prêt à le supprimer, vous devez d’abord le désinscrire. Pour désinscrire le package MSIX, exécutez les commandes suivantes dans la même session PowerShell. Ces commandes récupèrent à nouveau le paramètre du DeviceId disque et suppriment le package à l’aide de la $msixPackageFullName variable créée dans une section précédente.

$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

Déstage d’un package MSIX

Enfin, pour démonter le package MSIX, vous devez démonter votre image disque, exécutez la commande suivante dans la même session PowerShell pour vous assurer que le package n’est toujours inscrit pour aucun utilisateur. Cette commande utilise la $msixPackageFullName variable créée dans une section précédente.

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

Démonter l’image des disques

Pour terminer le processus de détaging, vous devez démonter les disques du système. La commande que vous devez utiliser dépend du format de votre image disque. Sélectionnez l’onglet approprié pour le format que vous utilisez.

Pour démonter une image de disque CimFS, exécutez les commandes suivantes dans la même session PowerShell :

Dismount-CimDiskImage -DeviceId $deviceId

Une fois que vous avez terminé le démontage de vos disques, vous avez supprimé votre package MSIX en toute sécurité.

Configurer des scripts de simulation pour l’agent App Attach

Si vous souhaitez ajouter et supprimer automatiquement des packages MSIX sur votre appareil, vous pouvez utiliser les commandes PowerShell de cet article pour créer des scripts qui s’exécutent au démarrage, à l’ouverture de session, à la fermeture de session et à l’arrêt. Pour en savoir plus, consultez Utilisation de scripts de démarrage, d’arrêt, d’ouverture de session et de déconnexion dans stratégie de groupe. Vous devez vous assurer que toutes les variables requises pour chaque phase sont disponibles dans chaque script.

Vous créez un script pour chaque phase :

  • Le script de démarrage exécute le processus de phase .
  • Le script d’ouverture de session exécute le processus d’inscription .
  • Le script de déconnexion exécute le processus de désinscription .
  • Le script d’arrêt exécute le processus de désétage .

Remarque

Vous pouvez utiliser le planificateur de tâches pour exécuter le script de phase. Pour exécuter le script, définissez le déclencheur de tâche sur Quand l’ordinateur démarre et activez Exécuter avec les privilèges les plus élevés.

Utiliser des packages hors connexion

Si vous utilisez des packages sur des appareils qui ne sont pas connectés à Internet, vous devez vous assurer que les licences de package sont installées sur votre appareil pour exécuter correctement l’application. Si votre appareil est en ligne, les licences requises doivent être téléchargées automatiquement.

Pour installer les fichiers de licence, vous devez utiliser un script PowerShell qui appelle la MDM_EnterpriseModernAppManagement_StoreLicenses02_01 classe dans le fournisseur de pont WMI.

Voici comment configurer une licence pour une utilisation hors connexion :

  1. Téléchargez le package d’application, la licence et les frameworks requis à partir du Microsoft Store pour Entreprises. Vous avez besoin des fichiers de licence encodés et non codés. Pour savoir comment télécharger une application sous licence hors connexion, consultez Distribuer des applications hors connexion.

  2. Exécutez les commandes PowerShell suivantes en tant qu’administrateur. Vous pouvez installer la licence à la fin de la phase intermédiaire. Vous devez modifier les variables suivantes :

    • $contentID est la valeur ContentID du fichier de licence non codé (.xml). Vous pouvez ouvrir le fichier de licence dans un éditeur de texte de votre choix.

    • $licenseBlob est la chaîne entière de l’objet blob de licence dans le fichier de licence encodé (.bin). Vous pouvez ouvrir le fichier de licence encodé dans un éditeur de texte de votre choix.

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

Scripts de démonstration

Vous trouverez des scripts de démonstration pour les quatre phases de test des packages MSIX et de l’aide sur la syntaxe pour savoir comment les utiliser dans notre référentiel GitHub. Ces scripts fonctionnent avec n’importe quelle version de PowerShell et n’importe quel format d’image disque.

Étapes suivantes

En savoir plus sur App Attach dans Azure Virtual Desktop :