In un dominio Active Directory storico può capitare che i criteri di gruppo smettano di funzionare perché GptTmpl.inf
manca o è danneggiato. Questa guida spiega come rigenerare correttamente il file per la Default Domain Controllers Policy preservando i SID di dominio.
Scenario e sintomi
Contesto tipico:
- Dominio attivo dal 2005, functional level 2016, controller su Windows Server 2019.
- I GPO risultano inutilizzabili perché
GptTmpl.inf
manca sia nella Default Domain Policy (DDP) sia nella Default Domain Controllers Policy (DDCP). - Per la DDP si è temporaneamente risolto inserendo un file generico (senza SID di dominio).
- Per la DDCP invece non basta: il file contiene molti riferimenti a SID specifici del dominio (
S‑1‑5‑21‑<DomainSID>‑RID
) e un “template standard” non è utilizzabile. dcgpofix
non ha ricostruito il file mancante.
Cos’è GptTmpl.inf e perché è fondamentale
GptTmpl.inf
è il “Security Template” di un GPO: descrive diritti utente, opzioni di sicurezza e in parte ACL su file/servizi. Per la Default Domain Controllers Policy contiene i diritti che rendono un controller di dominio un server “speciale” (ad es. chi può accedere via RDP, chi può eseguire il backup, chi può replicare directory). Se manca o è corrotto, la sezione Security Settings del GPO non viene applicata e i DC possono perdere privilegi critici o accumulare impostazioni non coerenti.
Perché può sparire o corrompersi
- Eliminazioni accidentali durante attività su
SYSVOL
. - Ripristini parziali da backup o snapshot con replica non allineata.
- Antivirus/EDR troppo aggressivi su
SYSVOL
. - Replica DFSR in errore, conflitti o USN rollback storici.
- Modifiche manuali in GPMC interrotte o fallite a metà.
Soluzione consigliata: laboratorio + copia controllata
Il metodo più pulito è rigenerare il file in un ambiente isolato e poi “trasporre” i SID del dominio di produzione. Di seguito una procedura collaudata con dettaglio operativo:
Passo | Dettagli operativi |
---|---|
Creare un lab | Installare un controller di dominio isolato con stessa versione di Windows Server e stesso livello funzionale. Non serve lo stesso nome di dominio: serve solo un DC “pulito” che generi i GPO predefiniti. |
Esportare il file | Copiare \<lab‑dominio>\SYSVOL<lab‑dominio>\Policies\{6AC1786C-016F-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf . In laboratorio risulta identico su più DC del lab (lo replica DFSR), quindi la copia è affidabile. |
Adattare i SID | I SID S‑1‑5‑32‑xxx (Builtin) sono globali e non si toccano. I SID S‑1‑5‑21‑<DomainSID>‑RID sono specifici: sostituire il <DomainSID> con quello del dominio di produzione. Recuperarlo con wmic useraccount where name='administrator' get sid rimuovendo “-500 ” finale, oppure con PowerShell (vedi più sotto). |
Copiare in produzione | Incollare il file modificato nel percorso equivalente in SYSVOL del dominio reale e lasciare che la replica DFSR lo diffonda su tutti i DC. |
Verificare | Eseguire gpupdate /force su almeno un DC e su un server membro. Verificare la sincronizzazione con dcdiag /test:sysvolcheck e lo stato replica con repadmin . |
Preparazione del laboratorio
- Provisionare una VM con Windows Server 2019 (o la versione in uso in produzione).
- Installare AD DS:
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools Install-ADDSForest -DomainName lab.local -DomainMode Win2016 -ForestMode Win2016 -NoRebootOnCompletion:$false
- Al primo avvio, i GPO predefiniti vengono creati automaticamente:
- Default Domain Policy – GUID
{31B2F340-016D-11D2-945F-00C04FB984F9}
- Default Domain Controllers Policy – GUID
{6AC1786C-016F-11D2-945F-00C04FB984F9}
- Default Domain Policy – GUID
- Eseguire un
gpupdate /force
per forzare la generazione del contenuto di sicurezza.
Esportare e ispezionare il file del lab
Percorso del file da copiare:
\\lab.local\SYSVOL\lab.local\Policies\{6AC1786C-016F-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
Aprendolo noterai sezioni come [Unicode]
, [Version]
, [Registry Values]
, [Privilege Rights]
. I riferimenti a gruppi integrati usano SIDs S‑1‑5‑32‑xxx
(uguali ovunque). I riferimenti a gruppi del dominio (es. Domain Admins) usano il SID del dominio + RID (es. S‑1‑5‑21‑<DomainSID>‑512
).
Recuperare il DomainSID di produzione
Metodi affidabili:
- WMIC (rapido):
wmic useraccount where name='administrator' get sid
Elimina il suffisso-500
per ottenere il DomainSID. - PowerShell (consigliato):
Import-Module ActiveDirectory $domainSid = (Get-ADDomain).DomainSID.Value $domainSid
- Alternativa senza RSAT:
$sid = ([System.Security.Principal.NTAccount]"$env:USERDOMAIN\Administrator").Translate([System.Security.Principal.SecurityIdentifier]).Value $domainSid = $sid -replace '-500$','' $domainSid
Sostituire i SID del lab con quelli di produzione
Automatizza la sostituzione mantenendo intatti i RID finali (es. 512, 519, 520, 544 ecc.). Il pattern giusto è rimpiazzare S-1-5-21-aaa-bbb-ccc
con il DomainSID reale, lasciando la parte dopo l’ultimo trattino (il RID) com’è.
Script PowerShell per sostituire i Domain-SID
# Percorsi
$src = "C:\Temp\GptTmpl_lab.inf" # copia dal lab
$dst = "C:\Temp\GptTmpl_prod.inf" # file convertito
DomainSID reale
Import-Module ActiveDirectory
$domainSid = (Get-ADDomain).DomainSID.Value
Sostituisce solo i SID di tipo S-1-5-21-a-b-c (non tocca S-1-5-32-xxx)
(Get-Content -Path $src -Raw) ` -replace 'S-1-5-21-\d+-\d+-\d+', $domainSid`
| Set-Content -Path $dst -Encoding Unicode
Write-Host "Creato: $dst con DomainSID $domainSid"
Perché l’encoding Unicode? I file INF dei security template sono di norma in UTF-16LE; mantenere l’encoding evita problemi di parsing.
Backup e copia in produzione
- Backup della cartella del GPO su un DC qualsiasi:
$gpoGuid = "{6AC1786C-016F-11D2-945F-00C04FB984F9}" $gpoPath = "\\$env:USERDNSDOMAIN\SYSVOL\$env:USERDNSDOMAIN\Policies\$gpoGuid\MACHINE\Microsoft\Windows NT\SecEdit" $bk = "C:\BackupGPO\DDCPSecEdit$(Get-Date -Format yyyyMMddHHmmss)" New-Item -ItemType Directory -Force -Path $bk | Out-Null Copy-Item -Path $gpoPath\* -Destination $bk -Recurse -Force
- Distribuzione del file aggiornato:
Copy-Item -Path "C:\Temp\GptTmpl_prod.inf" -Destination "$gpoPath\GptTmpl.inf" -Force
- Allineamento versione GPO (opzionale ma utile): incrementa la “Computer Version” per segnalare il cambiamento ai client.
Import-Module GroupPolicy Aggiunge un valore fittizio e poi lo rimuove per far avanzare la versione Set-GPRegistryValue -Name "Default Domain Controllers Policy" ` -Key "HKLM\SOFTWARE\Policies\_VersionBump" -ValueName "Tick" -Type DWord -Value 1 Remove-GPRegistryValue -Name "Default Domain Controllers Policy" ` -Key "HKLM\SOFTWARE\Policies\_VersionBump" -ValueName "Tick"
Verifica post-ripristino
- Forzare l’applicazione:
gpupdate /force
- Confermare la replica SYSVOL:
dcdiag /test:sysvolcheck repadmin /replsummary repadmin /syncall /AdeP
- Controllare l’evento di applicazione criteri su “Microsoft-Windows-GroupPolicy/Operational”.
- Validare il risultato con:
gpresult /h C:\Temp\gp_ddcp.html
Apri il report e verifica che la Default Domain Controllers Policy applichi le impostazioni di sicurezza attese.
Riferimenti pratici sui SID (che cosa sostituire e che cosa no)
Tipo di SID | Esempio | Azioni |
---|---|---|
Gruppi Builtin (globali) | S-1-5-32-544 (Administrators), S-1-5-32-551 (Backup Operators) | Non modificare. Sono uguali in ogni dominio e lingua. |
Account/Group di dominio | S-1-5-21-<DomainSID>-512 (Domain Admins), -519 (Enterprise Admins), -516 (Domain Controllers), -518 (Schema Admins) | Sostituire <DomainSID> con il SID del dominio reale; lasciare invariato il RID finale. |
Account well-known local system | S-1-5-18 (Local System), S-1-5-19 (Local Service), S-1-5-20 (Network Service) | Non modificare. |
Alternative e note operative
dcgpofix /target:dc
ricrea la DDCP completa, ma può fallire se l’oggetto GPO è assente o se la replica AD/DFSR è corrotta. “Lab + copia” è spesso più rapido e meno invasivo.- File minimo a mano: possibile (sezioni essenziali
[Unicode]
,[Version]
,[Registry Values]
,[Privilege Rights]
), ma devi comunque individuare e sostituire tutti i Domain‑SID corretti. Alto rischio di errori. - Senza secondo server:
- Promuovi un DC temporaneo nello stesso dominio di produzione →
gpupdate
→ copiaGptTmpl.inf
generato → rimuovi il DC. - Se avessi un DC “sano”, potresti esportare con
secedit /export /cfg C:\Temp\sec.cfg /areas USER_RIGHTS
e da lì ricostruire il template (non nel nostro caso).
- Promuovi un DC temporaneo nello stesso dominio di produzione →
- Backup GPO: a ripristino avvenuto, salva fuori da SYSVOL:
Backup-GPO -Name "Default Domain Controllers Policy" -Path "C:\Backup_GPO"
- Mantenere in salute la replica DFSR:
repadmin /syncall /AdeP Controlla anche l'Event Viewer: "DFS Replication" e "GroupPolicy"
Esempio didattico di GptTmpl.inf (ridotto)
Attenzione: questo è un estratto semplificato per mostrare la struttura. Non usarlo in produzione; genera sempre il file in lab e sostituisci i SID.
[Unicode]
Unicode=yes
[Version]
signature="$CHICAGO$"
Revision=1
[Registry Values]
; Esempio: abilitare auditing o opzioni di sicurezza di base
MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1
[Privilege Rights]
; Gruppi Builtin (S-1-5-32-xxx) restano invariati
SeBackupPrivilege = *S-1-5-32-544
SeRestorePrivilege = *S-1-5-32-544
SeSecurityPrivilege = *S-1-5-32-544
; SID di dominio: sostituire mantenendo il RID
; Domain Admins (512), Enterprise Admins (519), Domain Controllers (516)
SeRemoteInteractiveLogonRight = S-1-5-21--512,S-1-5-21--519
SeTcbPrivilege = *S-1-5-21--516
SeDenyInteractiveLogonRight = *S-1-5-21--514 ; Domain Guests
SeDenyNetworkLogonRight = *S-1-5-21--514
; ...altre voci a seconda della versione di Windows Server e del baseline
Controlli di qualità dopo il ripristino
- Versione GPO: verifica che la “Computer Version” sia aumentata:
(Get-GPO -Name "Default Domain Controllers Policy").ComputerVersion
- RSOP: su un DC, esegui
rsop.msc
e verifica le voci sotto Configurazione computer > Impostazioni di Windows > Impostazioni di sicurezza > Assegnazione diritti utente. - Eventi SCECLI: nel registro “Security”/“System” cerca eventi che segnalano l’applicazione dei template di sicurezza (SCECLI).
Checklist rapida (riassunto operativo)
- Allestisci un lab con Windows Server e livello funzionale allineati alla produzione.
- Forza la creazione dei GPO predefiniti e copia
GptTmpl.inf
della DDCP. - Recupera il DomainSID reale e sostituiscilo nel file (lasciando i RID intatti).
- Esegui un backup della cartella
SecEdit
in produzione, poi sovrascriviGptTmpl.inf
. - Incrementa la versione del GPO (opzionale), replica e verifica con
gpupdate
,dcdiag
erepadmin
.
Domande frequenti
Posso copiare il file da un altro dominio di produzione?
Sì, purché sia della stessa famiglia di OS e baseline, ma devi comunque sostituire i Domain‑SID. Il metodo “lab” evita di importare personalizzazioni indesiderate.
Perché dcgpofix
non ha rigenerato il file?dcgpofix
ricrea i GPO predefiniti a partire da definizioni statiche; se l’oggetto GPO o la replica sono incoerenti, può non produrre i file nel percorso SYSVOL
oppure non allineare le versioni. In questi casi, il ripristino “lab + copia” è più affidabile.
Serve toccare gpt.ini
?
No, non necessariamente. Tuttavia incrementare la “Computer Version” del GPO facilita il ricalcolo da parte dei client. Il trucco “aggiungi e rimuovi una chiave fittizia” con Set-GPRegistryValue
funziona bene.
Gli alias locali (es. “Administrators”) cambiando lingua possono creare problemi?
Usando i SID con prefisso (es. S-1-5-32-544
) eviti la dipendenza dalla lingua e dai nomi localizzati.
Buone pratiche per il futuro
- Backup regolare dei GPO con GPMC (Backup) o PowerShell (
Backup-GPO
) verso una share esterna aSYSVOL
. - Versioning & change log: documenta modifiche ai diritti utente (sezione
[Privilege Rights]
) e alle opzioni di sicurezza. Usa il campo “Commento” del GPO per tracciare il motivo dell’intervento. - Lab permanente: testa patch e cambiamenti di baseline di sicurezza prima di toccare la produzione, così puoi sempre rigenerare file “puliti”.
- Monitor replica: mantieni DFSR in stato sano (
repadmin /replsummary
, log “DFS Replication”), per evitare drift tra DC.
Appendice: comandi utili a colpo d’occhio
:: Percorsi (produzione)
\<dominio>\SYSVOL<dominio>\Policies\{6AC1786C-016F-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
:: Forzare applicazione criteri
gpupdate /force
:: Verifica SYSVOL su DC
dcdiag /test:sysvolcheck
:: Replica AD/DFSR
repadmin /replsummary
repadmin /syncall /AdeP
:: RSOP e report
rsop.msc
gpresult /h C:\Temp\gp.html
:: Export diritti (se disponibile un DC sano)
secedit /export /cfg C:\Temp\sec.cfg /areas USER_RIGHTS
:: Backup GPO
Backup-GPO -Name "Default Domain Controllers Policy" -Path "C:\Backup_GPO"
Conclusione
Rigenerare GptTmpl.inf
per la Default Domain Controllers Policy in un ambiente “pulito” e poi adeguarlo ai SID del proprio dominio è la modalità più sicura per ripristinare i diritti di sicurezza dei DC. Con il controllo della replica, l’incremento della versione del GPO e una verifica mirata (gpupdate
, dcdiag
, repadmin
, gpresult
) si ottiene il pieno ripristino della funzionalità dei criteri di gruppo, riducendo i rischi di configurazioni parziali o incoerenti.
Ricapitolando: quando GptTmpl.inf
manca nella DDCP, evita template generici. Crea il file in lab, sostituisci i Domain‑SID, copia in SYSVOL
, forza la replica e valida. Infine, stabilisci un processo fisso di backup e test per prevenire recidive.