La conteneurisation applicative est accessible sur Azure Virtual Desktop depuis plusieurs mois. L’attachement via MSIX permet de fournir des applications à des machines virtuelles sans aucune installation locale. Cependant, Il est ici différent du format MSIX normal, car celui-ci est spécialement conçu pour AVD. Pour en savoir plus sur MSIX, consultez la page web Présentation de MSIX.
Pourquoi faire de la conteneurisation applicative pour Azure Virtual Desktop ?
Azure Virtual Desktop est principalement conçu pour délivrer une expérience utilisateur commune et partagée. Il arrive fréquemment que certains utilisateurs travaillent sur des applications spécifiques. Dans ce cas, il est possible de leur délivrer cet attendu de plusieurs manières :
- Gestion de applications requises dans une image OS spécifiquement dédiée
- Utilisation de solution de type Intune pour un déploiement distribué
- Approvisionnement d’applications via des solutions tierces (Liquidware Flexapp, Citrix AppLayering)
- Utilisation d’applications conteneurisées
Dans cet article, nous allons démontrer ensemble la dernière possibilité.
Etape 0 : Rappel des prérequis
Comme pour chaque déploiement réalisé sur ce blog, des prérequis sont nécessaires avant de pouvoir se concentrer sur MSIX AppAttach :
- Un tenant Microsoft (AAD)
- Une souscription Azure active
- Un domaine Active Directory Domain Services (AD DS)
- Un espace de stockage Azure joint au domaine AD DS
- Un agent Azure AD Connect installé et synchronisé avec votre Azure AD
- Un environnement Azure Virtual Desktop (Pool d’hôtes – Groupe d’application – Espace de travail – VMs)
- Facultatif : un Azure Bastion pour faciliter les connexions RDP
Une fois votre environnement Azure en place, plusieurs étapes sont nécessaires pour arriver à la mise à disposition des applications conteneurisées.
Etape I : Déployer une nouvelle VM Azure Windows 10
Cette nouvelle machine virtuelle vous nous être utile pour créer différents composants nécessaires :
- Création d’un certificat pour signature des packages MSIX
- Création du package MSIX
- Configuration des VMS AVD pour supporter la couche conteneur
- Création de l’image VHD
- Dépose de l’image VHD sur le partage de fichier
Patientez quelques minutes une fois la création lancée :
Une fois cette VM créée, utilisez Azure Bastion pour vous connecter en RDP sur votre machine virtuelle :
Joignez cette machine virtuelle au domaine AD DS, puis redémarrez-là :
Etape II : Préparation du certificat
Reconnectez à votre VM MSIX via Azure Bastion, puis lancez Windows PowerShell ISE, en mode administrateur :
Exécutez les commandes PowerShell suivantes :
Schtasks /Change /Tn "\Microsoft\Windows\WindowsUpdate\Scheduled Start" /Disable
reg add HKLM\Software\Policies\Microsoft\WindowsStore /v AutoDownload /t REG_DWORD /d 0 /f
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager /v PreInstalledAppsEnabled /t REG_DWORD /d 0 /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Debug /v ContentDeliveryAllowedOverride /t REG_DWORD /d 0x2 /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
reg add HKLM\Software\Microsoft\RDInfraAgent\MSIXAppAttach /v PackageListCheckIntervalMinutes /t REG_DWORD /d 1 /f
Exécutez la commande PowerShell suivante pour générer un certificat auto-signé sur votre domaine (JLOUDEV), et stockez le dans le dossier Personal des certificats locaux :
New-SelfSignedCertificate -Type Custom -Subject "CN=Jloudev" -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "cert:\LocalMachine\My
Exécutez certlm.msc pour ouvrir la console des certificats locaux :
Lancez la commande d’Export sur ce nouveau certificat :
Cliquez sur Suivant :
Sélectionnez l’option Oui, exporter la clé privée, puis cliquez sur Suivant :
Cochez la case Exporter toutes les propriétés étendues, décochez la case Activer la confidentialité des certificats, puis cliquez sur Suivant :
Cochez la case Mot de passe, renseignez les deux champs dessous, puis cliquez sur Suivant :
Créez un nouveau dossier, par exemple celui-ci :
C:\MSIX
Renseignez le chemin de destination, puis cliquez sur Suivant :
Cliquez sur Terminer pour finaliser le processus :
Etape III : Déploiement du certificat sur les machines virtuelles AVD
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour déployer le certificat nouvellement généré dans Trusted People des machines virtuelles AVD :
$avdhosts = 'avd-vm-0','avd-vm-1'
$cleartextPassword = 'Demo!pass123'
$securePassword = ConvertTo-SecureString $cleartextPassword -AsPlainText -Force
$localPath = 'C:\MSIX'
ForEach ($avdhost in $avdhosts){
$remotePath = "\\$avdhost\C$\MSIX\"
New-Item -ItemType Directory -Path $remotePath -Force
Copy-Item -Path "$localPath\jloudev.tk.pfx" -Destination $remotePath -Force
Invoke-Command -ComputerName $avdhost -ScriptBlock {
Import-PFXCertificate -CertStoreLocation Cert:\LocalMachine\TrustedPeople -FilePath 'C:\MSIX\jloudev.tk.pfx' -Password $using:securePassword
}
}
Un tour rapide grâce à Azure Bastion sur une des machines virtuelles AVD nous confirme la bonne présence du certificat :
Etape IV : Téléchargements de l’application Mozilla Firefox
Dans notre démonstration, nous allons télécharger la dernière version de Mozilla Firefox. Nous prendrons l’installation au format MSI, disponible ici.
Lancez le téléchargement depuis la machine virtuelle MSIX comme ceci :
Copiez le fichier téléchargé dans le dossier C:\MSIX :
Etape V : Préparation avant création
Avant de lancer la création, exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour désactiver le service de recherche de Windows :
$serviceName = 'wsearch'
Set-Service -Name $serviceName -StartupType Disabled
Stop-Service -Name $serviceName
Profitez-en également pour créer cette nouvelle arborescence :
New-Item -ItemType Directory -Path 'C:\MSIX\Firefox' -Force
Exécutez la commande PowerShell suivante pour supprimer le Zone.Identifier des fichiers d’installation téléchargés depuis Internet :
Get-ChildItem -Path 'C:\MSIX' -Recurse -File | Unblock-File
Etape VI : Création du package applicatif
Pour continuer, vous aurez besoin de MSIX Packaging Tool, que vous trouverez dans le Microsoft Store. Lancez le téléchargement de ce dernier, toujours depuis la machine virtuelle MSIX :
Une fois le téléchargement terminé, lancez l’application.
Sur la page d’accueil, sélectionnez Application package afin de lancer la création d’un nouveau paquet :
Sur la page suivante, cochez la case Créer le paquet sur cet ordinateur, puis cliquez sur Suivant :
Attendez l’installation du pilote de l’outil de conditionnement MSIX, puis cliquez sur Suivant :
Sélectionnez Parcourir pour accéder au fichier d’installation de Firefox au format MSI :
C:\MSIX\Firefox Setup 95.0.msi
Dans la liste déroulante Préférence de signature, sélectionnez Signer avec un certificat (.pfx).
Recherchez le certificat C:\MSIX\jloudev.tk.pfx, saisissez le mot de passe Demo!pass123, puis cliquez sur Suivant :
Examinez et modifiez si besoin le nom du paquet, vérifiez que le nom de l’éditeur est défini sur CN=JLOUDEV, puis cliquez sur Suivant :
Cela déclenche alors l’installation de Mozilla Firefox de manière encapsulée :
Une fois l’installation terminée, vous retrouvez le message ci-dessous, cliquez sur Suivant :
Cliquez alors sur Suivant.
Lorsque le système vous demande Avez-vous terminé ?, sélectionnez Oui :
Vérifiez dans l’écran ci-dessous qu’aucun service n’est nécessaire, puis cliquez sur Suivant :
Changez le fichier et le dossier de destination :
C:\MSIX\Firefox\Firefox
Une fois la création terminée, cliquez sur Fermer :
Retrouvez les fichiers MSIX et XML suivants dans votre dossier C:\MSIX\Firefox :
Copiez seulement le fichier MSIX dans le dossier racine C:\MSIX :
Etape VII : Installation des fonctionnalités d’Hyperviseur
Maintenant, vous allez activer la fonctionnalité d’Hyperviseur sur l’ensemble des machines virtuelles Azure Virtual Desktop, mais également sur la machine MSIX :
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour commencer l’activation sur les VMs AVD :
$avdhosts = 'avd-vm-0','avd-vm-1'
ForEach ($avdhost in $avdhosts){
Invoke-Command -ComputerName $avdhost -ScriptBlock {
Schtasks /Change /Tn "\Microsoft\Windows\WindowsUpdate\Scheduled Start" /Disable
reg add HKLM\Software\Policies\Microsoft\WindowsStore /v AutoDownload /t REG_DWORD /d 0 /f
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager /v PreInstalledAppsEnabled /t REG_DWORD /d 0 /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Debug /v ContentDeliveryAllowedOverride /t REG_DWORD /d 0x2 /f
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
reg add HKLM\Software\Microsoft\RDInfraAgent\MSIXAppAttach /v PackageListCheckIntervalMinutes /t REG_DWORD /d 1 /f
Set-Service -Name wuauserv -StartupType Disabled
}
}
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour installer Hyper-V et ses outils de gestion sur les VMs AVD :
$avdhosts = 'avd-vm-0','avd-vm-1'
ForEach ($avdhost in $avdhosts){
Invoke-Command -ComputerName $avdhost -ScriptBlock {
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
}
}
Chaque hôte AVD doit redémarrer pour prendre en compte les modifications : cliquez sur Oui :
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour installer Hyper-V et ses outils de gestion sur la machine virtuelle MSIX :
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
La machine virtuelle MSIX doit elle aussi redémarrer :
Reconnectez-vous sur machine virtuelle MSIX, avec le même compte utilisateur qu’utilisé précédement :
Etape VIII : Créer une image jointe à une application MSIX
Ouvrez Microsoft Edge et rendez-vous sur la page suivante pour télécharger msixmgr.zip.
Dans l’Explorateur de fichiers, accédez au dossier Téléchargements, ouvrez le fichier compressé et copiez le dossier x64 dans le dossier C:\MSIX :
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour créer le fichier VHD qui servira d’image jointe de l’application MSIX :
New-Item -ItemType Directory -Path 'C:\MSIX\MSIXVhds' -Force
New-VHD -SizeBytes 256MB -Path 'C:\MSIX\MSIXVhds\Firefox.vhd' -Dynamic -Confirm:$false
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell IS, en mode administrateur , pour monter le fichier VHD nouvellement créé :
$vhdObject = Mount-VHD -Path 'C:\MSIX\MSIXVhds\Firefox.vhd' -Passthru
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour créer une nouvelle partition, la formater, et lui attribuer la première lettre de lecteur disponible :
$disk = Initialize-Disk -Passthru -Number $vhdObject.Number
$partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $disk.Number
Format-Volume -FileSystem NTFS -Confirm:$false -DriveLetter $partition.DriveLetter -Force
Cliquez sur Annuler pour ne pas formater à nouveau ce disque :
Le nouveau disque image est déjà présent dans l’explorateur de fichiers :
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour créer une structure de dossier qui hébergera les fichiers MSIX :
$appName = 'Firefox'
New-Item -ItemType Directory -Path "$($partition.DriveLetter):\Apps" -Force
Set-Location -Path 'C:\MSIX'
.\x64\msixmgr.exe -Unpack -packagePath .\$appName.msix -destination "$($partition.DriveLetter):\Apps" -applyacls
Constatez la présences des fichiers dans le nouveau disque :
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour démonter le fichier VHD qui servira d’image MSIX :
Dismount-VHD -Path "C:\MSIX\MSIXVhds\$appName.vhd" -Confirm:$false
Etape IX : Configurer le groupe Active Directory contenant les hôtes AVD
Retournez sur votre contrôleur de domaine via Azure Bastion :
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour créer un groupe AD DS qui sera synchronisé avec Azure AD :
$ouPath = "OU=AVD-Devices,DC=jloudev,DC=tk"
New-ADGroup -Name 'avd-hosts' -GroupScope 'Global' -GroupCategory Security -Path $ouPath
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour ajouter les machines virtuelles AVD en tant que membres du groupe que vous avez créé à l’étape précédente :
Get-ADGroup -Identity 'avd-hosts' | Add-AdGroupMember -Members 'avd-vm-0$','avd-vm-1$'
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour redémarrer les VMs AVD :
$hosts = (Get-ADGroup -Identity 'avd-hosts' | Get-ADGroupMember | Select-Object Name).Name
$hosts | Restart-Computer
Ce nouveau groupe doit faire partie des synchronisations vers Azure AD. Pour cela, vérifiez dans votre configuration Azure AD Connect que cette OU est bien synchronisée :
Contrôlez après 30 minutes que le nouveau groupe remonte bien dans Azure AD :
Pour que les machines virtuelles Azure Virtual Desktop remontent bien dans ce groupe, il est nécessaire de reconfigurer également Azure AD Connect.
Retournez dans ce dernier pour activer la fonctionnalité Hybrid Azure AD Join :
Une fois les identifiants d’administrateur global renseignés, choisissez l’option ci-dessous :
Cochez la case pour remonter les machines Windows 10 et ultérieures :
Renseignez un compte Enterprise Administrator :
Une fois la configuration d’Azure AD Connect terminée :
- Redémarrez les machines virtuelles AVD
- Utilisez Azure Bastion pour vous connecter sur chaque VM AVD avec le compte avdadmin1@jloudev.tk
- Retournez sur votre contrôleur de domaine via Azure Bastion (ou sur la machine virtuelle sur laquelle est installé Azure AD Connect), puis saisissez la commande PowerShell suivante en mode administrateur :
Start-ADSyncSyncCycle -PolicyType Initial
Attendez quelques minutes et contrôler la présence des machines virtuelles AVD dans le groupe AD sur Azure AD :
Etape X : Ajout des droits pour les VMs AVD sur le compte de stockage
Afin de mettre à disposition l’application packagée, nous allons créer un nouveau partage de fichier sur le compte de stockage existant.
Retournez sur votre portail Azure et rendez-vous sur le compte de stockage utilisé pour FSLogix :
Cliquez sur ce nouveau partage de fichier pour rajouter les 3 droits d’accès suivants :
Option | Valeur |
---|---|
Rôle | Storage File Data SMB Share Elevated Contributor |
Assign access to | Group |
Select | avd-admins |
Option | Valeur |
---|---|
Rôle | Storage File Data SMB Share Elevated Contributor |
Assign access to | Group |
Select | avd-hosts |
Option | Valeur |
---|---|
Rôle | Storage File Data SMB Share Reader |
Assign access to | Group |
Select | avd-group |
Une fois les droits en place, retournez sur votre machine virtuelle MSIX avec le compte avdadmin1 via Azure Bastion, pour connecter ce nouveau partage de fichier grâce à la commande suivante :
$connectTestResult = Test-NetConnection -ComputerName jlosto.file.core.windows.net -Port 445
if ($connectTestResult.TcpTestSucceeded) {
# Mount the drive
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\jlosto.file.core.windows.net\msixvhds" -Persist
} else {
Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port."
}
Exécutez les commandes suivantes via le programme CMD pour accorder les permissions NTFS requises :
icacls Z:\ /grant JLOUDEV\avd-hosts:(OI)(CI)(RX) /T
icacls Z:\ /grant JLOUDEV\avd-group:(OI)(CI)(RX) /T
icacls Z:\ /grant JLOUDEV\avd-admins:(OI)(CI)(F) /T
Exécutez le script PowerShell suivant depuis votre fenêtre Windows PowerShell ISE, en mode administrateur, pour recopier le fichier VHD vers le partage de fichiers Azure :
New-Item -ItemType Directory -Path 'Z:\packages'
Copy-Item -Path 'C:\MSIX\MSIXVhds\Firefox.vhd' -Destination 'Z:\packages' -Force
Un contrôle dans l’explorateur de fichier nous permet de vérifier la bonne présence de ce dernier :
Etape XI : Ajout de l’application MSIX sur l’environnement Azure Virtual Desktop
On arrive presque au bout ! Il ne nous reste maintenant qu’à rajouter notre application MSIX sur notre pool d’hôtes Azure Virtual Desktop. Pour cela, retournez sur votre portail Azure et cherchez votre pool d’hôtes, cliquez sur MSIX packages, puis sur Ajouter :
Saisissez le chemin suivant pour chercher le package nouvellement généré :
\\jlosto.file.core.windows.net\msixvhds\packages\Firefox.vhd
Renseignez les champs ci-dessous de la façon suivante, puis cliquez sur Ajoutez :
Vérifiez la bonne présence de votre application dans l’écran des applications :
Rendez-vous maintenant dans la section groupe d’applications, puis cliquez sur Ajouter :
Renseignez un nom à votre groupe d’applications, puis cliquez sur Suivant :
Sur le second onglet, cliquez sur Ajouter des applications :
Renseignez les champs ci-dessous, puis cliquez sur Sauvegarder et passez à l’onglet suivant :
Ajoutez votre groupe d’utilisateurs AVD puis passez sur l’onglet suivant :
Reprenez votre espace de travail existant puis validez les derniers onglets pour lancer la création :
Quelques minutes plus tard, la création se termine :
Etape XII : Test du package MSIX
Pour cela rien de plus simple, ouvrez l’application Remote Desktop. Voici le lien vers la page Microsoft si vous avez besoin de la télécharger :
Une fois installée, cliquez sur Souscrire :
Renseignez les identifiants d’un utilisateur présent dans votre groupe d’utilisateurs AVD :
Décochez la case et cliquez sur Non :
Constatez la présence de l’icône de bureau à distance et du nouvel icône pour Firefox :
Cliquez sur Firefox et renseignez le mot de passe de l’utilisateur AVD :
Firefox s’ouvre bien comme une application publiée sur votre poste local !!!
Le petit icône spécial dans la barre des tâches vous montre bien qu’il s’agit d’une application publiée et non locale :
Conclusion
Félicitations ! Vous avez réussi votre premier package applicatif via MSIX sur votre environnement Azure Virtual Desktop. On ne va pas se mentir, les premières opérations de mise en place demandent de la vigilance. Mais à force de pratiquer, les choses deviennent plus simples. Nul doute que tout cela peut vous faire gagner un temp considérable dans la mise à jour des applications dans de larges environnements Azure Virtual Desktop.
Comme toujours, faites part de vos remarques dans les commentaires ????
Bravo pour ce très bon tuto et très détaillé.
Cela fait plusieurs jours que j’en cherche un qui va jusqu’au bout des choses.
Merci 🙂
Bonjour Jean-Loup,
Merci pour cet article detaillé, je ne comprends par contre pas pourquoi vous joignez vos avd hosts à ADDS: Cela ne me semble pas un prérequis… Vous confirmez?
Merci pour le retour Charles !
C’est pourtant bien un prérequis Microsoft toujours valable encore ce moment, même avec un App-V
https://learn.microsoft.com/fr-fr/azure/virtual-desktop/app-attach-setup?wt.mc_id=MVP_315088&tabs=portal&pivots=msix-app-attach