XFA vooraf installeren met Microsoft Intune
Voeg XFA.msi toe als Win32 app met een detectieregel op aanwezigheid, en geef je koppeltoken mee als installatieargument.
XFA is gemaakt om zelf geïnstalleerd te worden door het team dat je wilt beveiligen. Zij installeren het zelf na een uitnodiging via Awareness, of bij een aanmelding die door Enforcement beschermd wordt. Voor de meeste organisaties is dat de hele uitrol.
XFA.msi uploaden als line-of-business app is de voor de hand liggende weg, en net die loopt fout. Een line-of-business app herkent XFA aan de product code van de MSI, en XFA maakt die code opnieuw aan telkens wanneer het zichzelf bijwerkt. Na de eerste zelfupdate vindt Intune de code die het noteerde niet meer, meldt het XFA als niet geïnstalleerd, en installeert het bij elke controle de oudere versie uit het pakket over de nieuwere heen. Ignore app version helpt niet: dat negeert de versie, niet de product code. Verpak XFA in plaats daarvan als Win32 app, waar je de detectieregel zelf bepaalt.
Kopieer het uit Integraties > XFA vooraf installeren via MDM > Microsoft Intune in het XFA-dashboard, waar het volledige commando met het token er al in staat. Vooraf installeren is een Enterprise-functie.
1. Download het installatiebestand en verpak het
Zet twee bestanden in een lege map:
- XFA.msi.
uninstall-xfa.ps1, het verwijderscript hieronder. De product code van XFA verandert bij elke zelfupdate, dus het verwijderen kan niet naar de oorspronkelijke MSI verwijzen: na een update komt die code niet meer overeen met wat er geïnstalleerd staat. Het script zoekt het huidige product op via Windows Installer aan de hand van de vaste UpgradeCode van XFA, die nooit verandert en niet afhangt van de 32-bits of 64-bits registerweergave, en verwijdert het daarna:
$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 levert Win32-apps als .intunewin-bestanden. Verpak de hele map, want zo komt uninstall-xfa.ps1 mee in de app, met de Win32 Content Prep Tool van Microsoft:
IntuneWinAppUtil.exe -c <folder with XFA.msi and uninstall-xfa.ps1> -s XFA.msi -o <output folder>
Eén installatiebestand dekt x64 en ARM64. Op een ARM64-toestel draait het onder emulatie en vervangt XFA zichzelf automatisch door de native ARM64-versie.
2. Voeg de app toe
Ga in het Intune-beheercentrum naar Apps > All apps > Create. Kies het platform Windows, kies Windows app (Win32) en upload de XFA.intunewin die je net hebt gemaakt.
3. Stel het programma in
| Veld | Waarde |
|---|---|
| Install command | msiexec /i "XFA.msi" /qn ENROLLMENT_TOKEN=<token-from-xfa-dashboard> |
| Uninstall command | powershell.exe -NoProfile -ExecutionPolicy Bypass -File uninstall-xfa.ps1 |
| Install behavior | User |
Dit is de instelling die goed moet staan, en Win32-apps staan standaard op System. Laat je die staan, dan voert Intune msiexec uit als het systeemaccount, installeert XFA in het systeemprofiel en mislukt het koppelen, omdat er geen aangemelde persoon is om voor te installeren. Zet Install behavior op User, zodat de installatie in de context van de aangemelde gebruiker draait. Het is dezelfde valkuil als Install for user in Configuration Manager.
Het verwijdercommando voert uninstall-xfa.ps1 uit, het script dat je in stap 1 hebt meeverpakt. Omdat de install behavior op User staat, draait het als de aangemelde gebruiker en verwijdert het XFA aan de hand van de product code die op dat moment geïnstalleerd is.
4. Stel de detectieregel in
Deze stap voorkomt dat XFA zichzelf in een lus blijft herinstalleren. Kies Use a custom detection script en upload het script hieronder.
Intune voert detectiescripts uit als het systeemaccount, ook al installeert de app voor de gebruiker. Een regel die HKEY_CURRENT_USER of %LOCALAPPDATA% uitleest, kijkt dus in het profiel van het systeemaccount en meldt XFA als ontbrekend. XFA installeert bovendien per gebruiker, dus "geïnstalleerd" is een vraag over de aangemelde gebruiker en niet over de machine: op een gedeelde pc heeft elke gebruiker een eigen kopie nodig. XFA schrijft per gebruiker een markering weg op HKCU\Software\XFA\DesktopApp, die het systeemaccount kan lezen in de hive van die gebruiker onder HKEY_USERS. Nog een addertje: XFA.msi is een 32-bits installatiebestand, dus op een 64-bits machine staat de markering in de 32-bits registerweergave, en na de zelfupdate naar ARM64 verhuist die naar de 64-bits weergave. Detectiescripts draaien standaard 64-bits, dus zoek eerst uit wie er aangemeld is en controleer beide weergaven:
$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 beschouwt de app als geïnstalleerd wanneer het script iets naar standaarduitvoer schrijft, dus er wordt niets geschreven wanneer XFA ontbreekt. De detectie kijkt naar aanwezigheid en niet naar de versie, zodat de zelfupdates van XFA er nooit over struikelen. Omdat de regel op de aangemelde gebruiker gericht is, installeert Intune XFA voor elke persoon op een gedeelde machine, in plaats van iedereen na de eerste over te slaan. De try/catch faalt veilig: kan het account niet naar een SID vertaald worden, dan schrijft het script niets en leest Intune "niet geïnstalleerd", nooit een verkeerde match.
Dit gaat uit van één interactieve gebruiker tegelijk, het normale geval bij een laptop of desktop. Op een host met meerdere sessies (Remote Desktop Session Host) geeft Win32_ComputerSystem.UserName alleen de gebruiker aan de fysieke console door.
5. Wijs de app toe
Voeg onder Assignments de gebruikersgroep die XFA moet krijgen toe onder Required.
Wijs toe aan een gebruikersgroep, niet aan een toestelgroep. XFA installeert voor wie aangemeld is en koppelt die persoon, dus een toewijzing aan toestellen installeert het voor niemand.
6. Controleren
Zodra Intune de app als geïnstalleerd meldt, controleer je of:
- het XFA-icoon in het systeemvak van de aangemelde gebruiker verschijnt, en
- het toestel bij die gebruiker verschijnt op de pagina Toestellen in XFA.
Mislukt het koppelen, dan mislukt de installatie mee, dus toont Intune de app als failed in plaats van succes te melden op een toestel dat nooit bij je organisatie kwam. Intune meldt een algemene installatiefout (het toont de eigen reden van XFA niet), dus lees de reden in %TEMP%\xfa\xfa-enrollment.log op het toestel:
| Code | Betekenis |
|---|---|
| 2 | Het koppeltoken werd geweigerd. Maak een nieuw token aan in het XFA-dashboard. |
| 3 | XFA was niet bereikbaar. Intune probeert het opnieuw. |
| 1, 4, 5 | Het commando klopte niet, of het toestel kon zijn gegevens niet bewaren. |
XFA verwijderen
Hef de koppeling op voor je verwijdert. Een toewijzing Uninstall in Intune voert het verwijdercommando uit maar niet xfa unenroll, dus blijft de koppeling met de organisatie op de server achter. Bij een toestel dat bij meerdere organisaties hoort, haalt het XFA ook bij die andere weg.
Voer dit eerst uit als de aangemelde gebruiker, om alleen deze organisatie te verwijderen en XFA geïnstalleerd te houden:
xfa unenroll --organization-id <organization-id>
Verwijder de applicatie pas wanneer er geen koppeling meer is. xfa enrollment-status geeft afsluitcode 0 zolang het toestel nog aan een organisatie gekoppeld is, en 10 wanneer verwijderen veilig is. Meldt het 10, stel dan de toewijzing Uninstall in.