Saltar al contenido principal

Preinstalar XFA con Microsoft Intune

Añada XFA.msi como Win32 app con una regla de detección basada en la presencia, y pase su token de inscripción como argumento de instalación.

XFA no necesita un MDM

XFA está pensado para que lo instale por su cuenta el equipo que quiere proteger. Ellos mismos lo instalan tras una invitación a través de Awareness, o en un inicio de sesión protegido por Enforcement. Para la mayoría de organizaciones ese es todo el despliegue.

No añada XFA como line-of-business app

Subir XFA.msi como line-of-business app es la vía evidente, y es la que se rompe. Una line-of-business app detecta XFA por el product code de su MSI, y XFA regenera ese product code cada vez que se actualiza. Después de la primera autoactualización, Intune ya no encuentra el código que registró, informa de que XFA no está instalado y reinstala la versión empaquetada antigua sobre la más nueva, en cada comprobación. Ignore app version no lo salva: eso ignora la versión, no el product code. Empaquete XFA como Win32 app, donde es usted quien define la regla de detección.

Consiga su token de inscripción

Cópielo desde Integraciones > Preinstalar XFA mediante MDM > Microsoft Intune en el panel de XFA, que muestra el comando terminado con el token ya incluido. La preinstalación es una función Enterprise.

1. Descargue y empaquete el instalador

Ponga dos archivos en una carpeta vacía:

  • XFA.msi.
  • uninstall-xfa.ps1, el script de eliminación de más abajo. El product code de XFA cambia con cada autoactualización, así que la desinstalación no puede nombrar el MSI original; después de una actualización su product code ya no coincide con lo instalado. El script resuelve el producto actual a través de Windows Installer por el UpgradeCode estable de XFA, que nunca cambia y no depende de la vista de registro de 32 o 64 bits, y después lo quita:
$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 distribuye las Win32 apps como archivos .intunewin. Empaquete la carpeta entera, que es lo que mete uninstall-xfa.ps1 dentro de la app, con la Win32 Content Prep Tool de Microsoft:

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

Un solo instalador cubre x64 y ARM64. En un dispositivo ARM64 se ejecuta bajo emulación y XFA se sustituye automáticamente por la versión nativa ARM64.

2. Añada la app

En el centro de administración de Intune, vaya a Apps > All apps > Create. Seleccione la plataforma Windows, elija Windows app (Win32) y suba el XFA.intunewin que acaba de crear.

3. Configure el programa

CampoValor
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 tiene que estar en User, no en System

Este es el ajuste que hay que acertar, y las Win32 apps vienen por defecto en System. Si se deja así, Intune ejecuta msiexec como la cuenta del sistema, XFA se instala en el perfil del sistema y la inscripción falla porque no hay ninguna persona con la sesión iniciada para la que instalar. Ponga Install behavior en User para que la instalación se ejecute en el contexto del usuario conectado. Es la misma trampa que Install for user en Configuration Manager.

El comando de desinstalación ejecuta uninstall-xfa.ps1, el script que empaquetó en el paso 1. Como el install behavior es User, se ejecuta como el usuario con la sesión iniciada y quita XFA con el product code que esté instalado en ese momento.

4. Configure la regla de detección

Este es el paso que evita que XFA se reinstale en bucle. Elija Use a custom detection script y suba el script de más abajo.

Intune ejecuta los scripts de detección como la cuenta del sistema, aunque la app se instale para el usuario, así que una regla que lea HKEY_CURRENT_USER o %LOCALAPPDATA% mira en el perfil propio de la cuenta del sistema e informa de que falta XFA. XFA además se instala por usuario, así que "instalado" es una pregunta sobre el usuario con la sesión iniciada, no sobre la máquina: en un PC compartido cada usuario necesita su propia copia. XFA escribe un marcador por usuario en HKCU\Software\XFA\DesktopApp, que la cuenta del sistema puede leer en el hive de ese usuario dentro de HKEY_USERS. Un detalle más: XFA.msi es un instalador de 32 bits, así que en una máquina de 64 bits el marcador está en la vista de registro de 32 bits, y tras la autoactualización a ARM64 pasa a la vista de 64 bits. Los scripts de detección se ejecutan en 64 bits por defecto, así que resuelva quién tiene la sesión iniciada y compruebe las dos vistas:

$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 considera la app instalada cuando el script escribe en la salida estándar, así que no se escribe nada cuando XFA no está. Esto detecta por presencia, no por versión, así que las autoactualizaciones de XFA nunca lo activan, y como se limita al usuario con la sesión iniciada, Intune instala XFA para cada persona de una máquina compartida en lugar de saltárselas todas después de la primera. El try/catch falla en cerrado: si la cuenta no se puede resolver a un SID, el script no escribe nada e Intune lee "no instalado", nunca una coincidencia falsa.

Esto da por supuesto un solo usuario interactivo a la vez, el caso normal en un portátil o un ordenador de sobremesa. En un host multisesión (Remote Desktop Session Host), Win32_ComputerSystem.UserName informa únicamente del usuario de la consola física.

5. Asigne la app

En Assignments, añada bajo Required el grupo de usuarios que debe recibir XFA.

Asigne a un grupo de usuarios, no a un grupo de dispositivos. XFA se instala para quien tenga la sesión iniciada e inscribe a esa persona, así que una asignación a dispositivos no lo instala para nadie.

6. Verifique

Cuando Intune informe de que la app está instalada, confirme que:

  • el icono de XFA aparece en la bandeja del sistema del usuario con la sesión iniciada; y
  • el dispositivo aparece para ese usuario en la página Dispositivos de XFA.

Si la inscripción falla, la instalación falla con ella, así que Intune muestra la app como failed en lugar de informar de un éxito en un dispositivo que nunca se unió a su organización. Intune informa de un fallo genérico del instalador (no expone el código de motivo propio de XFA), así que lea el motivo en %TEMP%\xfa\xfa-enrollment.log en el dispositivo:

CódigoSignificado
2El token de inscripción fue rechazado. Vuelva a emitirlo en el panel de XFA.
3No se pudo contactar con XFA. Intune lo reintenta.
1, 4, 5El comando era incorrecto, o el dispositivo no pudo guardar sus credenciales.

Quitar XFA

Dé de baja la inscripción antes de desinstalar. Una asignación Uninstall de Intune ejecuta el comando de desinstalación pero no ejecuta xfa unenroll, así que deja la afiliación con la organización en el servidor y, en un dispositivo que pertenece a más de una organización, le quita XFA también a las demás.

Ejecute esto primero como el usuario con la sesión iniciada, para quitar solo esta organización y mantener XFA instalado:

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

Después quite la aplicación solo cuando no quede ninguna afiliación. xfa enrollment-status devuelve el código de salida 0 mientras el dispositivo siga afiliado a alguna organización, y 10 cuando ya es seguro quitarlo. Cuando informe de 10, configure la asignación Uninstall.