Pular para o conteúdo principal

Pré-instalar o XFA com o Microsoft Intune

Adicione o XFA.msi como Win32 app com uma regra de deteção baseada na presença, e passe o seu token de inscrição como argumento de instalação.

O XFA não exige um MDM

O XFA foi feito para ser instalado pela própria equipa que quer proteger. As pessoas instalam-no elas próprias depois de um convite através do Awareness, ou num início de sessão protegido pelo Enforcement. Para a maioria das organizações, é essa toda a distribuição.

Não adicione o XFA como line-of-business app

Carregar o XFA.msi como line-of-business app é o caminho óbvio, e é o que corre mal. Uma line-of-business app deteta o XFA pelo product code do MSI, e o XFA gera um novo product code sempre que se atualiza. Depois da primeira atualização automática, o Intune deixa de encontrar o código que registou, comunica o XFA como não instalado e reinstala a versão mais antiga do pacote por cima da mais recente, a cada verificação. O Ignore app version não resolve isto: ignora a versão, não o product code. Em vez disso, empacote o XFA como Win32 app, onde é você a definir a regra de deteção.

Obtenha o seu token de inscrição

Copie-o de Integrações > Pré-instalar o XFA através de MDM > Microsoft Intune no painel XFA, que mostra o comando pronto com o token já lá dentro. A pré-instalação é uma funcionalidade Enterprise.

1. Transfira e empacote o instalador

Coloque dois ficheiros numa pasta vazia:

  • XFA.msi.
  • uninstall-xfa.ps1, o script de remoção abaixo. O product code do XFA muda a cada atualização automática, por isso a desinstalação não pode nomear o MSI original; depois de uma atualização, o product code deste já não corresponde ao que está instalado. O script resolve o produto atual através do Windows Installer pelo UpgradeCode estável do XFA, que nunca muda e não depende da vista de registo de 32 ou 64 bits, e remove-o:
$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
}

O Intune distribui as Win32 apps como ficheiros .intunewin. Empacote a pasta inteira, que é o que coloca o uninstall-xfa.ps1 dentro da aplicação, com a Win32 Content Prep Tool da Microsoft:

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

Um único instalador cobre x64 e ARM64. Num dispositivo ARM64 corre sob emulação e o XFA substitui-se automaticamente pela versão nativa ARM64.

2. Adicione a aplicação

No centro de administração do Intune, vá a Apps > All apps > Create. Selecione a plataforma Windows, escolha Windows app (Win32) e carregue o XFA.intunewin que acabou de criar.

3. Defina o 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 tem de ser User, não System

Esta é a definição que tem de acertar, e as Win32 apps ficam por predefinição em System. Se ficar assim, o Intune executa o msiexec como conta do sistema, o XFA instala-se no perfil do sistema e não consegue inscrever-se, porque não há nenhuma pessoa com sessão iniciada para quem instalar. Defina Install behavior como User para que a instalação corra no contexto do utilizador com sessão iniciada. É a mesma armadilha que Install for user no Configuration Manager.

O comando de desinstalação executa o uninstall-xfa.ps1, o script que empacotou no passo 1. Como o install behavior é User, corre como o utilizador com sessão iniciada e remove o XFA seja qual for o product code atualmente instalado.

4. Defina a regra de deteção

Este é o passo que evita que o XFA se reinstale em ciclo. Escolha Use a custom detection script e carregue o script abaixo.

O Intune executa os scripts de deteção como conta do sistema, mesmo que a aplicação se instale para o utilizador, por isso uma regra que leia HKEY_CURRENT_USER ou %LOCALAPPDATA% procura no perfil da própria conta do sistema e comunica o XFA como em falta. O XFA é também uma instalação por utilizador, por isso "instalado" é uma pergunta sobre o utilizador com sessão iniciada, não sobre a máquina: num PC partilhado, cada utilizador precisa da sua própria cópia. O XFA escreve um marcador por utilizador em HKCU\Software\XFA\DesktopApp, que a conta do sistema consegue ler na hive desse utilizador em HKEY_USERS. Há mais um pormenor: o XFA.msi é um instalador de 32 bits, por isso numa máquina de 64 bits o marcador está na vista de registo de 32 bits, e depois da atualização automática para ARM64 passa para a vista de 64 bits. Os scripts de deteção correm em 64 bits por predefinição, por isso determine quem tem sessão iniciada e verifique ambas as 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 { }
}

O Intune trata a aplicação como instalada quando o script escreve na saída padrão, por isso nada é escrito quando o XFA está ausente. Isto deteta pela presença, não pela versão, por isso as atualizações automáticas do XFA nunca o fazem disparar e, como o âmbito é o utilizador com sessão iniciada, o Intune instala o XFA para cada pessoa numa máquina partilhada em vez de saltar toda a gente depois da primeira. O try/catch falha em segurança: se a conta não puder ser resolvida para um SID, o script não escreve nada e o Intune lê "não instalado", nunca uma correspondência falsa.

Isto pressupõe um utilizador interativo de cada vez, o caso normal num portátil ou num computador de secretária. Num anfitrião multi-sessão (Remote Desktop Session Host), Win32_ComputerSystem.UserName comunica apenas o utilizador da consola física.

5. Atribua a aplicação

Em Assignments, adicione o grupo de utilizadores que deve receber o XFA em Required.

Atribua a um grupo de utilizadores, não a um grupo de dispositivos. O XFA instala-se para quem tiver sessão iniciada e inscreve essa pessoa, por isso uma atribuição a dispositivos instala-o para ninguém.

6. Verifique

Depois de o Intune comunicar a aplicação como instalada, confirme que:

  • o ícone do XFA aparece na área de notificação do utilizador com sessão iniciada; e
  • o dispositivo aparece para esse utilizador na página Dispositivos do XFA.

Se a inscrição falhar, a instalação falha com ela, por isso o Intune mostra a aplicação como failed em vez de comunicar sucesso num dispositivo que nunca se juntou à sua organização. O Intune comunica uma falha genérica do instalador (não expõe o código de razão do próprio XFA), por isso leia a razão em %TEMP%\xfa\xfa-enrollment.log no dispositivo:

CódigoSignificado
2O token de inscrição foi recusado. Emita-o de novo no painel XFA.
3Não foi possível contactar o XFA. O Intune tenta de novo.
1, 4, 5O comando estava errado, ou o dispositivo não conseguiu guardar as suas credenciais.

Remover o XFA

Desinscreva antes de desinstalar. Uma atribuição Uninstall do Intune executa o comando de desinstalação mas não executa xfa unenroll, por isso deixa a afiliação à organização para trás no servidor e, num dispositivo que pertença a mais do que uma organização, retira também o XFA das outras.

Execute isto primeiro, como o utilizador com sessão iniciada, para remover apenas esta organização e manter o XFA instalado:

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

Depois remova a aplicação apenas quando já não restar nenhuma afiliação. O xfa enrollment-status devolve o código de saída 0 enquanto o dispositivo continuar afiliado a alguma organização, e 10 quando for seguro remover. Quando indicar 10, defina a atribuição Uninstall.