Aller au contenu principal

Préinstaller XFA avec Microsoft Intune

Ajoutez XFA.msi comme Win32 app avec une règle de détection basée sur la présence, et passez votre token de rattachement comme argument d'installation.

XFA n'a pas besoin d'un MDM

XFA est fait pour être installé par l'équipe que vous voulez sécuriser. Les utilisateurs l'installent eux-mêmes après une invitation via Awareness, ou lors d'une connexion protégée par Enforcement. Pour la plupart des organisations, c'est tout le déploiement.

N'ajoutez pas XFA comme line-of-business app

Téléverser XFA.msi comme line-of-business app est la voie évidente, et c'est celle qui casse. Une line-of-business app détecte XFA par le product code de son MSI, et XFA régénère ce product code à chaque fois qu'il se met à jour. Après la première mise à jour automatique, Intune ne retrouve plus le code qu'il avait enregistré, considère XFA comme non installé et réinstalle la version packagée plus ancienne par-dessus la plus récente, à chaque vérification. Ignore app version n'y change rien : cela ignore la version, pas le product code. Packagez plutôt XFA comme une Win32 app, où c'est vous qui définissez la règle de détection.

Récupérez votre token de rattachement

Copiez-le depuis Intégrations > Préinstaller XFA via un MDM > Microsoft Intune dans le tableau de bord XFA, qui affiche la commande finie avec le token déjà dedans. La préinstallation est une fonctionnalité Enterprise.

1. Téléchargez et packagez le programme d'installation

Placez deux fichiers dans un dossier vide :

  • XFA.msi.
  • uninstall-xfa.ps1, le script de retrait ci-dessous. Le product code de XFA change à chaque mise à jour automatique, donc la désinstallation ne peut pas nommer le MSI d'origine ; après une mise à jour, son product code ne correspond plus à ce qui est installé. Le script résout le produit actuel via Windows Installer à partir de l'UpgradeCode stable de XFA, qui ne change jamais et ne dépend pas de la vue 32 bits ou 64 bits du registre, puis le retire :
$ErrorActionPreference = 'Stop'
$upgradeCode = '{FE5FD0A4-8D39-42FD-B0DE-18EB89B7CAC4}'
try {
$installer = New-Object -ComObject WindowsInstaller.Installer
$products = @($installer.RelatedProducts($upgradeCode))

if ($products.Count -ne 1) { exit 1 }
$p = Start-Process 'msiexec.exe' -ArgumentList "/x $($products[0]) /qn" -Wait -PassThru
if (-not $p) { exit 1 }
exit $p.ExitCode
} catch {
exit 1
}

Intune livre les Win32 apps sous forme de fichiers .intunewin. Empaquetez le dossier entier, ce qui place uninstall-xfa.ps1 à l'intérieur de l'app, avec le Win32 Content Prep Tool de Microsoft :

IntuneWinAppUtil.exe -c <folder with XFA.msi and uninstall-xfa.ps1> -s XFA.msi -o <output folder>

Un seul programme d'installation couvre x64 et ARM64. Sur un appareil ARM64, il tourne en émulation et XFA se remplace automatiquement par la version ARM64 native.

2. Ajoutez l'app

Dans le centre d'administration Intune, allez dans Apps > All apps > Create. Sélectionnez la plateforme Windows, choisissez Windows app (Win32) et téléversez le XFA.intunewin que vous venez de construire.

3. Configurez le programme

ChampValeur
Install commandmsiexec /i "XFA.msi" /qn ENROLLMENT_TOKEN=<token-from-xfa-dashboard>
Uninstall commandpowershell.exe -NoProfile -ExecutionPolicy Bypass -File uninstall-xfa.ps1
Install behaviorUser
Install behavior doit être sur User, pas sur System

C'est le paramètre à ne pas rater, et les Win32 apps sont par défaut sur System. Laissé ainsi, Intune exécute msiexec en tant que compte système, XFA s'installe dans le profil système, et le rattachement échoue parce qu'il n'y a personne de connecté pour qui installer. Mettez Install behavior sur User, pour que l'installation s'exécute dans le contexte de l'utilisateur connecté. C'est le même piège que Install for user sur Configuration Manager.

La commande de désinstallation exécute uninstall-xfa.ps1, le script que vous avez packagé à l'étape 1. Comme l'install behavior est sur User, il s'exécute en tant qu'utilisateur connecté et retire XFA quel que soit le product code actuellement installé.

4. Configurez la règle de détection

C'est l'étape qui empêche XFA de se réinstaller en boucle. Choisissez Use a custom detection script et téléversez le script ci-dessous.

Intune exécute les scripts de détection en tant que compte système, même si l'app s'installe pour l'utilisateur, donc une règle qui lit HKEY_CURRENT_USER ou %LOCALAPPDATA% regarde dans le profil du compte système et signale XFA comme absent. XFA est en plus une installation par utilisateur, donc "installé" est une question qui porte sur l'utilisateur connecté, pas sur la machine : sur un PC partagé, chaque utilisateur a besoin de sa propre copie. XFA écrit un marqueur par utilisateur dans HKCU\Software\XFA\DesktopApp, que le compte système peut lire dans la ruche de cet utilisateur sous HKEY_USERS. Une subtilité de plus : XFA.msi est un programme d'installation 32 bits, donc sur une machine 64 bits le marqueur se trouve dans la vue 32 bits du registre, et après la mise à jour automatique ARM64 il passe dans la vue 64 bits. Les scripts de détection s'exécutent en 64 bits par défaut, donc déterminez qui est connecté et vérifiez les deux vues :

$console = (Get-CimInstance Win32_ComputerSystem).UserName
if ($console) {
try {
$sid = ([System.Security.Principal.NTAccount]$console).Translate(
[System.Security.Principal.SecurityIdentifier]).Value
$installed = $false
foreach ($view in @([Microsoft.Win32.RegistryView]::Registry32,
[Microsoft.Win32.RegistryView]::Registry64)) {
$base = [Microsoft.Win32.RegistryKey]::OpenBaseKey(
[Microsoft.Win32.RegistryHive]::Users, $view)
try {
$key = $base.OpenSubKey("$sid\Software\XFA\DesktopApp")
if ($key) { $installed = $true; $key.Close() }
} finally { $base.Close() }
}
if ($installed) { Write-Output 'Installed' }
} catch { }
}

Intune considère l'app comme installée dès que le script écrit sur la sortie standard, donc rien n'est écrit quand XFA est absent. La détection porte sur la présence, pas sur la version, donc les mises à jour automatiques de XFA ne la déclenchent jamais, et comme elle est limitée à l'utilisateur connecté, Intune installe XFA pour chaque personne sur une machine partagée au lieu de sauter tout le monde après la première. Le try/catch échoue du bon côté : si le compte ne peut pas être résolu en SID, le script n'écrit rien et Intune lit "non installé", jamais une fausse correspondance.

Cela suppose un seul utilisateur interactif à la fois, le cas normal pour un portable ou un poste fixe. Sur un hôte multisession (Remote Desktop Session Host), Win32_ComputerSystem.UserName ne rapporte que l'utilisateur de la console physique.

5. Assignez l'app

Sous Assignments, ajoutez sous Required le groupe d'utilisateurs qui doit recevoir XFA.

Assignez à un groupe d'utilisateurs, pas à un groupe d'appareils. XFA s'installe pour la personne connectée et rattache cette personne, donc une assignation à des appareils ne l'installe pour personne.

6. Vérifiez

Une fois qu'Intune signale l'app comme installée, vérifiez que :

  • l'icône XFA apparaît dans la zone de notification de l'utilisateur connecté ; et
  • l'appareil apparaît pour cet utilisateur sur la page Appareils de XFA.

Si le rattachement échoue, l'installation échoue avec lui, donc Intune affiche l'app comme failed plutôt que de signaler une réussite sur un appareil qui n'a jamais rejoint votre organisation. Intune signale une erreur d'installation générique (il ne remonte pas le code de raison propre à XFA), donc lisez le motif dans %TEMP%\xfa\xfa-enrollment.log sur l'appareil :

CodeSignification
2Le token de rattachement a été refusé. Générez-en un nouveau dans le tableau de bord XFA.
3XFA n'a pas pu être joint. Intune réessaie.
1, 4, 5La commande était incorrecte, ou l'appareil n'a pas pu enregistrer ses identifiants.

Retirer XFA

Annulez le rattachement avant de désinstaller. Une assignation Uninstall dans Intune exécute la commande de désinstallation mais n'exécute pas xfa unenroll, donc elle laisse le rattachement à l'organisation en place côté serveur, et sur un appareil qui appartient à plusieurs organisations elle retire aussi XFA pour les autres.

Exécutez d'abord ceci en tant qu'utilisateur connecté, pour retirer uniquement cette organisation et garder XFA installé :

xfa unenroll --organization-id <organization-id>

Ne retirez ensuite l'application qu'une fois qu'il ne reste plus aucun rattachement. xfa enrollment-status renvoie le code de sortie 0 tant que l'appareil est encore rattaché à une organisation, et 10 dès qu'il est sûr de le retirer. Quand il renvoie 10, mettez en place l'assignation Uninstall.