Group Policy – Applicazione e verifica tramite UserEnv.log

Ciao a tutti!

Eccoci al successivo appuntamento con il file "UserEnv.Log".
In questo post andremo a verificare come vengono lette, scelte e applicate le Group Policy ad un utente.

Prima cosa: ricordatevi di abilitare il log UserEnv.

Nel registry bisogna impostare:

Chiave: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
Nome: UserEnvDebugLevel
Tipo: REG_DWORD
Valore: 10002 (Hex)

il riavvio non è necessario ma vi permette di partire con dei riferimenti "orari" più gestibili.

Con i client XP è preferibile disabilitare il "Fast Logon" in modo da consentire l'applicazione delle policy al logon dell'utente.

Per farlo è necessario impostare tramite policy (locale o di dominio) questo parametro su "Enabled":

Computer Configuration\Administrative Templates\System\Logon\Always wait for the network at computer startup and logon

e questo lo consiglio in ogni caso per verificare se un problema con l'applicazione delle policy non sia solo causato dalla rete.

Ora partiamo con le verifiche sul log dove analizzeremo la parte user per semplificare, dato che per la parte computer è tutta identica...

Identificarne l'inizio è semplice, il log ci viene in aiuto con:

USERENV(278.44c) 11:45:26:800 ProcessGPOs:
USERENV(278.44c) 11:45:26:800 ProcessGPOs:
USERENV(278.44c) 11:45:26:800 ProcessGPOs: Starting user Group Policy (Async forground|Background) processing...
USERENV(278.44c) 11:45:26:800 ProcessGPOs:
USERENV(278.44c) 11:45:26:800 ProcessGPOs:

In queste prime linee si vede come l'applicazione delle GPOs sia avvenuta in modalità Asincrona (Async forground -> Fast Logon di XP) o Sincrona (Background -> Fast Logon disabilitato)

Successivamente il sistema effettua un controllo sulla velocità della rete in modo da poter distinguere se il dialogo con il DC è su una rete veloce o lenta.
Per i dettagli vi invito a leggere quanto indcato nel mio post “Group Policy: Slow Link Detection

Poi calcola la posizione dell'utente all'interno delle varie unità organizzative (OU in Active Directory Users and Computers) ed il DC da cui prendere le policy:

USERENV(278.44c) 11:45:26:815 ProcessGPOs: User name is: CN=Utente,OU=Admin,OU=Office,OU=Reparto,DC=Dominio,DC=it, Domain name is: DOMINIO
USERENV(278.44c) 11:45:26:815 ProcessGPOs: Domain controller is: <\\DC02.dominio.it> Domain DN is dominio.it

Verifica lo stato locale delle estensioni per le policy in modo da segnare che cosa è stato applicato fino ad ora:

USERENV(278.44c) 11:45:26:831 ReadExtStatus: Reading Previous Status for extension {35378EAC-683F-11D2-A89A-00C04FBBCFA2}
USERENV(278.44c) 11:45:26:831 ReadExtStatus: Reading Previous Status for extension {0ACDD40C-75AC-47ab-BAA0-BF6DE7E7FE63}
USERENV(278.44c) 11:45:26:831 ReadExtStatus: Reading Previous Status for extension {25537BA6-77A8-11D2-9B6C-0000F8080861}
.
.
.
USERENV(278.44c) 11:45:26:831 ReadStatus: Read Extension's Previous status successfully.

 L'elenco delle estensioni base e la loro specialità sono descritti nel seguente articolo:

KB 216357 - Identifying Group Policy Client-Side Extensions

Tutte le estensioni registrate sul computer sono reperibile nel registro in:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\GPExtensions

Questo stato verrà successivamente confrontato con lo stato delle policy in modo da non dover applicare ogni volta le stesse impostazioni, velocizzando ulteriormente l'applicazione delle policy.

Inizia quindi la fase di raccolta di tutte le policy seguendo un ordine ben preciso, in base all'unità organizzativa di appartenenza.

USERENV(278.44c) 11:45:26:847 SearchDSObject: Searching <OU=Admin,OU=Office,OU=Reparto,DC=Dominio,DC=it>

Se in un OU non ci sono policy troveremo:

USERENV(278.44c) 11:45:26:847 SearchDSObject: No GPO(s) for this object.

altrimenti:

USERENV(278.44c) 11:45:26:847 SearchDSObject: Found GPO(s): <[LDAP://cn={9AE7BFE1-D75E-42C2-B882-2BA60429EE59},cn=policies,cn=system,DC=Dominio,DC=it;0][LDAP://cn={DFB99C69-78B2-42F8-AF08-EAD9A86300BC},cn=policies,cn=system,DC=Domino,DC=it;0][LDAP://cn={EEF0C2F8-7A3D-49F5-8E5D-6D411965F41C},cn=policies,cn=system,DC=Dominio,DC=it;0][LDAP://cn={55F90D04-552E-4DB9-8FA8-942668047EBC},cn=policies,cn=system,DC=Dominio,DC=it;0]>
USERENV(278.44c) 11:45:26:847 ProcessGPO: ==============================
USERENV(278.44c) 11:45:26:847 ProcessGPO: Deferring search for <LDAP://cn={9AE7BFE1-D75E-42C2-B882-2BA60429EE59},cn=policies,cn=system,DC=Dominio,DC=it>
USERENV(278.44c) 11:45:26:847 ProcessGPO: ==============================
USERENV(278.44c) 11:45:26:847 ProcessGPO: Deferring search for <LDAP://cn={DFB99C69-78B2-42F8-AF08-EAD9A86300BC},cn=policies,cn=system,DC=Dominio,DC=it>
USERENV(278.44c) 11:45:26:847 ProcessGPO: ==============================
USERENV(278.44c) 11:45:26:847 ProcessGPO: Deferring search for <LDAP://cn={EEF0C2F8-7A3D-49F5-8E5D-6D411965F41C},cn=policies,cn=system,DC=Dominio,DC=it>
USERENV(278.44c) 11:45:26:847 ProcessGPO: ==============================
USERENV(278.44c) 11:45:26:847 ProcessGPO: Deferring search for <LDAP://cn={55F90D04-552E-4DB9-8FA8-942668047EBC},cn=policies,cn=system,DC=Dominio,DC=it>

e via di seguito:

USERENV(278.44c) 11:45:26:847 SearchDSObject: Searching <OU=Office,DC=Dominio,DC=it>
.
.
.
USERENV(278.44c) 11:45:26:847 SearchDSObject: Searching <DC=Dominio,DC=it>
.
.
.

ed infine (se presenti) quelle del sito di appartenenza:

USERENV(278.44c) 11:45:26:862 SearchDSObject: Searching <CN=MILANO,CN=Sites,CN=Configuration,DC=Dominio,DC=it>

Avendo ora costruito l'elenco delle policy queste verranno applicate in ordine inverso, quindi si parte da quelle trovate nel sito, poi quelle all'origine del dominio e via via verso l'unità organizzativa dove risiede l'utente od il computer.

Per ogni policy da processare il sistema verifica se si ha l'accesso (security o filtri WMI), la versione, se è abilitata o disabilita e con quali estensioni.
Ecco un esempio:

USERENV(278.44c) 11:45:26:878 ProcessGPO: ==============================
USERENV(278.44c) 11:45:26:878 ProcessGPO: Searching <CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=Dominio,DC=it>
USERENV(278.44c) 11:45:26:878 ProcessGPO: User has access to this GPO.
USERENV(278.44c) 11:45:26:878 ProcessGPO: GPO passes the filter check.
USERENV(278.44c) 11:45:26:878 ProcessGPO: Found functionality version of: 2
USERENV(278.44c) 11:45:26:878 ProcessGPO: Found file system path of: <\\Dominio.it\sysvol\Dominio.it\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}>
USERENV(278.44c) 11:45:26:893 ProcessGPO: Found common name of: <{31B2F340-016D-11D2-945F-00C04FB984F9}>
USERENV(278.44c) 11:45:26:893 ProcessGPO: Found display name of: <Default Domain Policy>
USERENV(278.44c) 11:45:26:893 ProcessGPO: Found user version of: GPC is 1, GPT is 1
USERENV(278.44c) 11:45:26:893 ProcessGPO: Found flags of: 0
USERENV(278.44c) 11:45:26:893 ProcessGPO: Found extensions: [{3060E8D0-7020-11D2-842D-00C04FA372D4}{3060E8CE-7020-11D2-842D-00C04FA372D4}][{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{0F6B957E-509E-11D1-A7CC-0000F87571E3}]
USERENV(278.44c) 11:45:26:893 ProcessGPO: ==============================

Dopo aver processato le policy si passa a processare tutte le estensioni:

USERENV(278.44c) 11:45:26:924 ProcessGPOs: Processing extension Registro di sistema
USERENV(278.44c) 11:45:26:924 ReadStatus: Read Extension's Previous status successfully.
USERENV(278.44c) 11:45:26:924 CompareGPOLists: The lists are the same.
USERENV(278.44c) 11:45:26:940 ProcessGPOList: Entering for extension Registro di sistema
USERENV(278.44c) 11:45:26:940 UserPolicyCallback: Setting status UI to Applicazione del criterio Registro di sistema in corso...
USERENV(278.44c) 11:45:26:940 ProcessGPOList: No changes. CSE will not be passed in the IwbemServices intf ptr
USERENV(278.44c) 11:45:26:940 EnterCriticalPolicySectionEx: Entering with timeout 60000 and flags 0x2
USERENV(278.44c) 11:45:26:940 EnterCriticalPolicySectionEx: User critical section has been claimed. Handle = 0x6d8
USERENV(278.44c) 11:45:26:940 EnterCriticalPolicySectionEx: Leaving successfully.
USERENV(278.44c) 11:45:26:940 ResetPolicies: Entering.
USERENV(278.44c) 11:45:27:018 ProcessGPOList: Extension Registro di sistema status was not updated because there was no changes and no transition or rsop wasn't enabled
USERENV(278.44c) 11:45:27:018 ProcessGPOs: -----------------------
.
.
.
USERENV(278.44c) 11:45:27:034 ProcessGPOs: Processing extension Personalizzazione Internet Explorer
USERENV(278.44c) 11:45:27:034 ReadStatus: Read Extension's Previous status successfully.
USERENV(278.44c) 11:45:27:034 CompareGPOLists: The lists are the same.
USERENV(278.44c) 11:45:27:034 ProcessGPOList: Entering for extension Personalizzazione Internet Explorer
USERENV(278.44c) 11:45:27:034 UserPolicyCallback: Setting status UI to Applicazione del criterio Personalizzazione Internet Explorer in corso...
USERENV(278.44c) 11:45:27:034 ProcessGPOList: No changes. CSE will not be passed in the IwbemServices intf ptr
USERENV(278.44c) 11:45:27:734 UserPolicyCallback: Setting status UI to Applicazione delle impostazioni personali in corso...
USERENV(278.44c) 11:45:27:734 ProcessGPOList: Extension Personalizzazione Internet Explorer returned 0x0.
USERENV(278.44c) 11:45:27:734 ProcessGPOList: Extension Personalizzazione Internet Explorer status was not updated because there was no changes and no transition or rsop wasn't enabled
.
.
.

Ho messo queste 2 estensioni per far risaltare che durante queste fasi cambia la scritta a video (Setting status UI to...) prima di presentare il desktop all'utente.
Ed infine:

.
.
.
USERENV(278.44c) 11:45:27:750 ProcessGPOs: User Group Policy has been applied.

Di seguito vi riporto la documentazione ufficiale:

Alla prossima!

Domenico Costa
Senior Support Engineer
Microsoft Enterprise Platform Support