Préinstaller XFA avec Microsoft Configuration Manager (SCCM)
Créez une application avec un deployment type Windows Installer et passez votre token de rattachement comme propriété MSI. La préinstallation est une fonctionnalité Enterprise.
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.
1. Téléchargez le programme d'installation
Téléchargez XFA.msi et placez-le sur votre partage de contenu.
Un seul programme d'installation couvre x64 et ARM64. Sur ARM64, il tourne en émulation et XFA se remplace automatiquement par la version native.
2. Créez l'application
Dans la console Configuration Manager, allez dans Software Library > Application Management > Applications et créez une application à partir de XFA.msi. Configuration Manager lit le product code et crée la méthode de détection pour vous.
La règle que vous définissez indique si XFA est installé, pas si cet utilisateur est rattaché à votre organisation. Pour confirmer le rattachement, par exemple quand un appareil fait peut-être déjà tourner XFA pour une autre organisation, utilisez une règle de conformité qui s'exécute dans le contexte de l'utilisateur. Une méthode de détection s'exécute en tant que compte système, qui ne peut pas atteindre l'installation par utilisateur, donc %LOCALAPPDATA% ci-dessous ne pointe vers le bon profil que si la règle s'exécute en tant qu'utilisateur.
xfa n'est pas dans le PATH et c'est une application fenêtrée, donc une règle qui l'exécute directement ne l'attend pas et ne reçoit pas son code de sortie. Lancez le backend, attendez-le, et ne rapportez le rattachement que sur le code de sortie 0 (10 signifie non rattaché) :
$run = Start-Process "$env:LOCALAPPDATA\XFA\xfa-backend.exe" -Wait -PassThru `
-ArgumentList 'enrollment-status', '--organization-id', '<id>'
if ($run.ExitCode -eq 0) { Write-Output 'Affiliated' }
C'est le paramètre à ne pas rater. La règle que Configuration Manager génère vérifie le product code du MSI. XFA régénère son product code à chaque mise à jour automatique, donc après la première le code enregistré ne correspond plus. Configuration Manager considère alors XFA comme non installé et réinstalle la version packagée par-dessus la plus récente, à chaque cycle d'évaluation. Laissée en place, elle diffuse une version plus ancienne sur tout votre parc.
Remplacez-la par un script de détection PowerShell. Configuration Manager considère XFA comme installé dès que le script écrit sur la sortie standard, et comme absent quand il n'écrit rien.
Le script doit tenir compte de deux choses. Configuration Manager exécute la détection en tant que compte système, même quand l'app s'installe pour l'utilisateur, donc une règle sous HKEY_CURRENT_USER ou %LOCALAPPDATA% lit le profil du compte système et ne voit jamais l'installation de l'utilisateur. Et XFA est 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.
Détectez donc l'installation de l'utilisateur connecté. 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 atterrit 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 vérifiez les deux vues et acceptez le marqueur dans l'une ou l'autre :
$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 { }
}
La détection porte sur la présence, pas sur la version, donc les mises à jour automatiques de XFA ne la déclenchent jamais. Elle est limitée à l'utilisateur connecté, donc sur une machine partagée Configuration Manager installe XFA pour chaque personne au moment où elle se connecte, au lieu de sauter tout le monde après la première. Le marqueur est écrit à l'installation et reste en place à travers les mises à jour automatiques, donc la règle tient pour n'importe quelle version. Le try/catch compte : si le compte ne peut pas être résolu en SID (par exemple parce qu'un contrôleur de domaine est brièvement injoignable), le script n'écrit rien et Configuration Manager lit "non installé", ce qui est le sens sûr, jamais une fausse correspondance.
Cela suppose un seul utilisateur interactif à la fois, ce qui est 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, donc la détection y couvre cet utilisateur-là plutôt que chaque session.
3. Configurez le programme d'installation
Reprenez la commande depuis Intégrations > Préinstaller XFA via un MDM > Microsoft Configuration Manager (SCCM) dans le tableau de bord XFA, qui contient déjà votre token :
msiexec /i "XFA.msi" /qn ENROLLMENT_TOKEN=<token-from-xfa-dashboard>
EMAIL fixe une seule adresse. Une application a un seul programme d'installation pour toute la collection, donc y mettre une adresse rattacherait tous les appareils de la collection à cette personne.
Sur un parc joint au domaine, XFA lit l'adresse dans l'attribut mail d'Active Directory, appareil par appareil, ce qui est bien ce que vous voulez. Il se rabat sur le user principal name quand mail est vide ou qu'aucun contrôleur de domaine n'est joignable.
Si des appareils échouent avec une erreur d'adresse, la correction se fait dans Active Directory (renseignez mail pour ces comptes), pas dans la commande d'installation. EMAIL sert à installer sur un seul appareil dont vous connaissez le propriétaire.
mail n'est pas l'identité sous laquelle vous rattachezPar défaut, XFA lit d'abord l'attribut mail d'Active Directory, puis le user principal name. Sur un parc Entra ou Microsoft 365, l'UPN est en général la vraie adresse de la personne, et mail peut être périmé ou vide. Ajoutez PREFER_UPN=1 à la commande d'installation pour essayer d'abord le user principal name :
msiexec /i "XFA.msi" /qn ENROLLMENT_TOKEN=<token> PREFER_UPN=1
Laissez-le de côté sur un parc classique joint au domaine : un suffixe d'annuaire comme corp.local ressemble à un UPN valide sans être une adresse, et c'est pourquoi mail passe en premier par défaut.
Programme de désinstallation :
powershell.exe -NoProfile -ExecutionPolicy Bypass -File uninstall-xfa.ps1
Le product code change à chaque mise à jour automatique, donc la désinstallation ne peut pas nommer le XFA.msi d'origine : après une mise à jour, son product code ne correspond plus à ce qui est installé. Livrez uninstall-xfa.ps1 à côté de XFA.msi dans la source de contenu. Le script résout le produit actuel via Windows Installer à partir de l'UpgradeCode stable de XFA, qui est le même pour toutes les versions et indépendant 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
}
Le programme de désinstallation retire le paquet mais n'exécute pas xfa unenroll, donc il laisse le rattachement à l'organisation en place côté serveur, et sur un appareil qui appartient à plusieurs organisations il retire aussi XFA pour les autres.
Exécutez d'abord xfa unenroll --organization-id <id> en tant qu'utilisateur connecté, pour retirer uniquement cette organisation et garder XFA installé. 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 désinstaller.
4. Configurez les options du deployment type
XFA est une application par utilisateur, donc elle doit s'installer pendant que l'utilisateur est connecté.
| Paramètre | Valeur |
|---|---|
| Installation behavior | Install for user |
| Logon requirement | Only when a user is logged on |
| Installation program visibility | Hidden |
| Deployment target | User collection |
Le client Configuration Manager s'exécute en tant que SYSTEM. Laissée sur Install for system, une application par utilisateur s'installe dans le profil SYSTEM : Configuration Manager signale une réussite, et l'utilisateur connecté n'a pas de XFA et n'apparaît jamais sur votre page Appareils.
XFA refuse de se rattacher quand il s'exécute en tant que compte système, donc cela signale une erreur qui nomme le paramètre plutôt que de se terminer dans un profil que personne n'utilise. Le paramètre reste ce qui l'évite.
5. Déployez et vérifiez
Déployez l'application vers une user collection, pour qu'elle s'installe pour l'utilisateur connecté.
XFA enregistre l'appareil auprès du service pendant l'installation, donc il apparaît tout de suite sur votre page Appareils. Il conserve ensuite les identifiants de l'appareil dans le profil de l'utilisateur connecté.
Une installation gérée peut s'exécuter dans une session qui ne peut pas encore écrire dans ce profil. Configuration Manager installe sous une ouverture de session côté service qui n'a pas de stockage d'identifiants à elle. Dans ce cas, XFA enregistre le rattachement et termine la conservation des identifiants à la prochaine connexion de l'utilisateur, depuis une session qui le peut, puis rapporte l'état de sécurité à partir de là. Un appareil fraîchement déployé peut donc apparaître avant de rapporter complètement, et se stabilise une fois que l'utilisateur s'est connecté. C'est automatique, il n'y a rien à configurer.
Vérifiez ensuite 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.
Un token refusé fait échouer l'installation, donc Configuration Manager affiche le déploiement comme échoué au lieu de laisser passer un appareil installé sans avoir rejoint votre organisation. Il signale une erreur d'installation générique plutôt que le code de raison propre à XFA, donc lisez le motif dans %TEMP%\xfa\xfa-enrollment.log sur l'appareil : un token refusé s'y lit comme le code 2, un service injoignable comme le code 3 (qui vaut la peine d'être réessayé). XFA reste installé dans les deux cas.