Su Windows Server 2019 usato come terminal server con profili FSLogix, le GIF nelle firme di Outlook possono non animarsi se “Mostra animazioni in Windows” è disattivato. Di seguito trovi come forzare da subito l’opzione per tutti gli utenti, in modo sicuro e ripetibile con GPO o script.
Scenario e problema
In ambienti Remote Desktop Services (RDS) o Citrix basati su Windows Server 2019 (1809), capita che gli utenti visualizzino firme e-mail con GIF statiche in Outlook. La causa più frequente è l’impostazione di Accessibilità “Mostra animazioni in Windows” non abilitata a livello di profilo. In un’infrastruttura con profili roaming in FSLogix, questa preferenza resta nel profilo dell’utente e, se non forzata, può variare da utente a utente o essere azzerata da immagini master, ottimizzazioni o policy di performance.
Soluzione rapida (riassunto operativo)
- Chiave di registro
HKEYCURRENTUSER\Control Panel\Desktop\UserPreferencesMask
- Valore da impostare
- Esadecimale (REGBINARY):
9E 3E 07 80
- Nota sul decimale: è stato riportato
1668704
come numero “funzionante” in alcuni casi, ma trattandosi di un bitmask binario multi‑byte è fortemente consigliato distribuire il valore come REGBINARY per evitare ambiguità di endianess e conversioni.
- Esadecimale (REGBINARY):
- Tipo di dato:
REGBINARY
(forma più sicura e coerente per GPO/GPP/script). - Procedura:
- Distribuire la chiave/valore via GPO Preferenze → Impostazioni di Registro oppure con script PowerShell in esecuzione all’accesso.
- Applicare la modifica a ogni utente (opzione “Apporta sempre” in GPP oppure script in
RunOnce
). - Richiedere logout/login (o riavvio) per rendere effettiva la nuova maschera di preferenze; in alternativa, usare un comando di refresh (vedi più avanti).
Perché proprio UserPreferencesMask
?
UserPreferencesMask
è una maschera di bit (4 byte) che governa diverse Visual Effects di Windows: animazioni, dissolvenze, effetti di transizione, ombre, ecc. Il valore 9E 3E 07 80
imposta la combinazione desiderata per assicurare che le animazioni siano abilitate. Poiché il valore è un bitmask composito, conviene distribuirlo come REGBINARY
esattamente nei quattro byte indicati. Convertirlo a decimale o tentare di scriverlo come REG_DWORD
può produrre risultati incoerenti a seconda dello strumento e dell’interpretazione little/big‑endian.
Suggerimento: se utilizzi una gold image o un profilo di riferimento, applica la chiave prima di eseguire sysprep
, così ogni nuovo utente erediterà l’impostazione senza ulteriori script.
Metodi di distribuzione consigliati
Metodo A — Group Policy Preferences (GPP) per HKCU
È il metodo più semplice e controllabile in ambienti RDS/FSLogix.
- Apri Group Policy Management e crea un nuovo GPO (es. “Enable Windows Animations”).
- Abilita, sull’OU dei server RDS, il Loopback di elaborazione delle GPO (Modalità: Merge o Replace) per garantire che le impostazioni utente vengano applicate quando la sessione è ospitata dai server RDS.
- Nel GPO vai su User Configuration → Preferences → Windows Settings → Registry e aggiungi un nuovo elemento:
- Azione: Replace (o Create al primo giro).
- Hive:
HKEYCURRENTUSER
. - Key Path:
Control Panel\Desktop
. - Value name:
UserPreferencesMask
. - Type:
REG_BINARY
. - Data:
9E 3E 07 80
(inserisci i quattro byte separati da spazi).
- Nella scheda Common:
- Spunta Run in logged-on user’s security context (user policy option).
- Valuta Apply once and do not reapply se vuoi un set “una tantum”; in RDS è spesso preferibile applicare sempre per resistere a modifiche manuali.
- Se utile, abilita Item-level targeting (per esempio filtra per OS = Windows Server 2019 o per appartenenza a gruppi).
- Collega il GPO all’OU dei server RDS (o all’OU degli utenti, se più opportuno) e forza un
gpupdate /force
in una sessione di test.
Metodo B — Policy “Disattiva animazioni non necessarie” (impostazione equivalente)
Se preferisci agire via Criteri (ADMX) invece che via bitmask, imposta la voce “Turn off all unnecessary animations (when possible)” su Disabled per consentire le animazioni. La trovi, a seconda della versione di template installati, tra le voci di Ease of Access/Accessibilità nei modelli amministrativi. In alcune edizioni è presente solo nel ramo Utente; in altre trovi anche l’equivalente a livello Computer. Se non la vedi nel ramo Computer, usa il ramo Utente con Loopback sul server RDS.
Obiettivo | Metodo | Percorso / Nota |
---|---|---|
Forzare animazioni a livello macchina | GPO → Turn off all unnecessary animations = Disabled | Usa il ramo Computer se disponibile. In alternativa, ramo User + Loopback. |
Verifica rapida senza riavvio | rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True | Ricarica le impostazioni desktop correnti dell’utente. |
Ridurre impatto su risorse | Affina le impostazioni di Outlook (download immagini, caching) e GPU per RDS | Vedi sezione “Prestazioni e ottimizzazioni”. |
Metodo C — Script PowerShell (logon o RunOnce)
Per chi preferisce un approccio “as‑code”, ecco due script pronti:
1) Applicazione per utente all’accesso
# Imposta la maschera come REGBINARY 9E 3E 07 80 per l'utente corrente
$path = 'HKCU:\Control Panel\Desktop'
$name = 'UserPreferencesMask'
$data = [byte[]](0x9e,0x3e,0x07,0x80)
if (-not (Test-Path $path)) { New-Item -Path $path -Force | Out-Null }
$current = (Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue).$name
$needsSet = $true
if ($null -ne $current) {
$currHex = ($current | ForEach-Object { $*.ToString('X2') }) -join ' '
$targetHex = ($data | ForEach-Object { $*.ToString('X2') }) -join ' '
$needsSet = ($currHex -ne $targetHex)
}
if ($needsSet) {
New-ItemProperty -Path $path -Name $name -PropertyType Binary -Value $data -Force | Out-Null
Aggiorna le preferenze grafiche senza riavvio (best effort)
Start-Process -FilePath 'rundll32.exe' -ArgumentList 'user32.dll,UpdatePerUserSystemParameters 1, True' -WindowStyle Hidden
}
2) Esecuzione una sola volta al primo accesso dell’utente
Usa RunOnce
per applicare la chiave e poi autorimuoversi:
$script = @'
$path = "HKCU:\Control Panel\Desktop"
$name = "UserPreferencesMask"
$data = [byte[]](0x9e,0x3e,0x07,0x80)
if (-not (Test-Path $path)) { New-Item -Path $path -Force | Out-Null }
New-ItemProperty -Path $path -Name $name -PropertyType Binary -Value $data -Force | Out-Null
Start-Process rundll32.exe "user32.dll,UpdatePerUserSystemParameters 1, True" -WindowStyle Hidden
'@
$target = "$env:LOCALAPPDATA\EnableWinAnimations.ps1"
$null = $script | Out-File -FilePath $target -Encoding ASCII -Force
New-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce' ` -Name 'EnableWinAnimations' -PropertyType String -Value "powershell.exe -ExecutionPolicy Bypass -File`"$target`"" -Force | Out-Null
Metodo D — File .REG (per test rapidi o integrazione nell’immagine)
Per convalida immediata su una sessione di laboratorio:
Windows Registry Editor Version 5.00
[HKEYCURRENTUSER\Control Panel\Desktop]
"UserPreferencesMask"=hex:9e,3e,07,80
Dopo l’import, esegui un logout/login oppure il comando di refresh indicato.
Applicazione a tutti gli utenti: nuove e vecchie sessioni
In ambienti FSLogix i profili sono contenitori persistenti. Significa che:
- Se applichi la GPO/GPP all’accesso, ogni sessione riceve e conserva la maschera corretta.
- Per nuovi utenti conviene impostare il valore nel profilo di riferimento (gold image) prima di
sysprep
, così la preferenza nasce già ON. - Per utenti esistenti con profili già creati, GPP o lo script logon garantiscono l’allineamento senza dover toccare i file VHD(X).
Attenzione: HKEY_USERS\.DEFAULT
non è il “profilo predefinito” dei nuovi utenti, bensì il profilo del servizio LocalSystem. Per pre‑configurare i nuovi profili offline, carica e modifica C:\Users\Default\NTUSER.DAT
tramite reg.exe load
(vedi snippet sotto) e poi reg.exe unload
.
Script per pre‑configurare il profilo “Default” (opzionale)
rem Esegui come amministratore su immagine/gold master
reg.exe load HKU\DefUser "C:\Users\Default\NTUSER.DAT"
reg.exe add "HKU\DefUser\Control Panel\Desktop" /v UserPreferencesMask /t REG_BINARY /d 9e3e0780 /f
reg.exe unload HKU\DefUser
Verifica, test e convalida
Verifica via Interfaccia
- Apri Impostazioni → Accessibilità → Effetti visivi.
- Controlla che Mostra animazioni in Windows sia Attivo.
Verifica via PowerShell
$bytes = (Get-ItemProperty -Path 'HKCU:\Control Panel\Desktop' -Name UserPreferencesMask).UserPreferencesMask
$hex = ($bytes | ForEach-Object { $_.ToString('X2') }) -join ' '
"UserPreferencesMask attuale: $hex"
Dovresti vedere 9E 3E 07 80
. Se l’output differisce, un’altra policy o un logon script potrebbe sovrascrivere il valore.
Refresh senza riavvio
Per applicare gli effetti grafici senza dover disconnettere:
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
Nota: il refresh è un best effort; per uniformità totale, preferisci un logout/login.
Prestazioni e ottimizzazioni in ambienti RDS
Abilitare le animazioni rende l’esperienza più fluida e risolve la mancata riproduzione di GIF in Outlook, ma su host multi‑utente può impattare CPU/GPU e banda RDP. Suggerimenti:
- GPU: se disponibile, abilita l’uso della GPU per sessioni RDS (Use hardware graphics adapters for all Remote Desktop Services sessions) per scaricare gli effetti grafici dall’host CPU.
- Codec RDP: mantieni H.264/AVC444 abilitato (impostazioni predefinite) per migliorare la resa delle animazioni con minor banda.
- Outlook: se l’obiettivo sono soprattutto le firme animate, verifica anche le impostazioni di download immagini e caching; gestisci in modo coerente le firme tramite modelli o distribuzione centralizzata.
- Targeting: con GPP applica l’impostazione solo dove serve (Item‑level targeting per OU, gruppo, device class) riducendo l’overhead su host che non gestiscono posta.
Risoluzione dei problemi
- Le GIF non si animano ancora in Outlook:
- Conferma che Mostra animazioni in Windows sia attivo nel profilo dell’utente (UI o PowerShell).
- Assicurati che nessuna policy di Accessibilità imponga la disattivazione (vedi Metodo B).
- Verifica il canale e la build di Outlook: alcune build datate non gestivano correttamente le GIF; mantieni il client aggiornato secondo la tua politica di update.
- Controlla impostazioni di Download immagini e criteri del Centro protezione che potrebbero bloccare contenuti remoti.
- La chiave torna a un altro valore dopo il logon:
- C’è probabilmente un altro GPO (o script) che riscrive
UserPreferencesMask
. Usagpresult /h
per identificare la policy vincente. - Se usi “Adjust for best performance” in script di ottimizzazione, rivedi quel passaggio: spesso cambia molte Visual Effects, animazioni incluse.
- In GPP, imposta l’azione su Replace e “Apporta sempre” per far prevalere il tuo valore.
- C’è probabilmente un altro GPO (o script) che riscrive
- Dubbi sul formato del valore:
- Distribuisci sempre come
REGBINARY
a quattro byte (9E 3E 07 80
). La rappresentazione “decimale” è ambigua e può variare in base all’interpretazione dello strumento.
- Distribuisci sempre come
Governance, sicurezza e rollback
- Change management: etichetta chiaramente il GPO (nome, scopo, owner), aggiungi una descrizione con il riferimento al requisito (GIF firme Outlook in RDS), e documenta OU e filtri di sicurezza/WMI.
- Rollback:
- Se hai usato la Policy “Turn off all unnecessary animations”, imposta la voce su Not Configured o Enabled (per disattivare le animazioni).
- Se hai usato GPP o script, rimuovi l’elemento e, se vuoi forzare la disattivazione, imposta un
UserPreferencesMask
coerente con l’assenza di animazioni (o applica la Policy di Accessibilità).
- Audit: in ambienti regolati, conserva l’evidenza dell’applicazione (report GPMC, esport script, screenshot impostazioni) e pianifica test funzionali su un campione di utenti.
Esempi “copincolla”
Reg.exe (sessione utente)
reg add "HKCU\Control Panel\Desktop" /v UserPreferencesMask /t REG_BINARY /d 9e3e0780 /f
rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
PowerShell (impostazione idempotente)
[byte[]]$bytes = 0x9e,0x3e,0x07,0x80
$path = "HKCU:\Control Panel\Desktop"
if (-not (Test-Path $path)) { New-Item -Path $path -Force | Out-Null }
$current = (Get-ItemProperty -Path $path -Name UserPreferencesMask -ErrorAction SilentlyContinue).UserPreferencesMask
if ($null -eq $current -or ($current | ForEach-Object ToString X2) -join ' ' -ne ($bytes | ForEach-Object ToString X2) -join ' ') {
New-ItemProperty -Path $path -Name UserPreferencesMask -PropertyType Binary -Value $bytes -Force | Out-Null
Start-Process rundll32.exe "user32.dll,UpdatePerUserSystemParameters 1, True" -WindowStyle Hidden
}
Modello .REG per integrazione immagine
Windows Registry Editor Version 5.00
[HKEYCURRENTUSER\Control Panel\Desktop]
"UserPreferencesMask"=hex:9e,3e,07,80
Domande frequenti
Questo valore cambia anche altri effetti grafici?
Sì. UserPreferencesMask
è una maschera che comprende più effetti. Il valore proposto è bilanciato per garantire le animazioni senza penalizzare l’esperienza utente standard su Server 2019. Se in azienda avevi una combinazione molto personalizzata, valuta un test comparativo.
Posso modificare solo “il bit delle animazioni”?
In teoria sì, ma servono mappature esatte dei bit. Poiché la maschera è storicamente poco documentata e varia tra versioni, la via operativa più sicura è distribuire un valore noto‑buono (come 9E 3E 07 80
) o usare la policy di Accessibilità che abilita/disabilita le animazioni senza toccare altri effetti.
Perché sconsigli il formato decimale?
Perché il valore è binario a 4 byte. Convertirlo “in decimale” richiede un’interpretazione (ordine dei byte) che non tutti gli strumenti gestiscono allo stesso modo. Con REGBINARY
eviti conversioni e garantisci esattamente i quattro byte desiderati.
Serve davvero il riavvio?
Di norma basta un logout/login. Il comando rundll32.exe user32.dll,UpdatePerUserSystemParameters 1, True
spesso è sufficiente a ricaricare gli effetti, ma per omogeneità e per applicazioni datate è più affidabile una nuova sessione.
Checklist di implementazione
- Replica in laboratorio il tuo scenario RDS/FSLogix.
- Applica il GPO GPP su un gruppo pilota di utenti/host.
- Esegui
gpupdate /force
e verifica il valore inHKCU
. - Apri Outlook, carica una firma con GIF e verifica l’animazione.
- Monitora CPU/GPU della sessione durante l’uso reale.
- Estendi il GPO alla produzione, tenendo abilitato Loopback dove necessario.
- Documenta: GPO, targeting, note di rilascio e piano di rollback.
Conclusioni
Forzare “Mostra animazioni in Windows” per tutti gli utenti su Windows Server 2019 è semplice e affidabile se fai leva su GPO Preferences o su un logon script che imposti UserPreferencesMask
al valore 9E 3E 07 80
. In ambienti FSLogix la modifica persiste nel contenitore profilo e, con un corretto Loopback, la coerenza è garantita per tutte le sessioni RDS. Così le GIF nelle firme di Outlook e le animazioni di sistema tornano a funzionare in maniera prevedibile, senza interventi manuali lato utente.
Tip finale: se prevedi di creare nuovi host o aggiornare l’immagine, integra la chiave nella gold image prima del sysprep
. Ridurrai le variabili di configurazione e accorcerai i tempi di onboarding dei nuovi utenti.
In sintesi
- Chiave:
HKCU\Control Panel\Desktop\UserPreferencesMask
- Valore:
9E 3E 07 80
(REGBINARY
) — preferibile e consigliato - Distribuzione: GPO (GPP Registro) o PowerShell (logon/RunOnce)
- Attivazione: logout/login o comando di refresh
- Alternative: Policy Turn off all unnecessary animations = Disabled