Rigenerare GptTmpl.inf per la Default Domain Controllers Policy in Active Directory (Windows Server) – Guida completa e sicura

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.

Indice

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:

PassoDettagli operativi
Creare un labInstallare 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 fileCopiare \<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 SIDI 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 produzioneIncollare il file modificato nel percorso equivalente in SYSVOL del dominio reale e lasciare che la replica DFSR lo diffonda su tutti i DC.
VerificareEseguire 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

  1. Provisionare una VM con Windows Server 2019 (o la versione in uso in produzione).
  2. Installare AD DS: Install-WindowsFeature AD-Domain-Services -IncludeManagementTools Install-ADDSForest -DomainName lab.local -DomainMode Win2016 -ForestMode Win2016 -NoRebootOnCompletion:$false
  3. 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}
  4. 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

  1. 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
  2. Distribuzione del file aggiornato: Copy-Item -Path "C:\Temp\GptTmpl_prod.inf" -Destination "$gpoPath\GptTmpl.inf" -Force
  3. 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 SIDEsempioAzioni
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 dominioS-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 systemS-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:
    1. Promuovi un DC temporaneo nello stesso dominio di produzione → gpupdate → copia GptTmpl.inf generato → rimuovi il DC.
    2. 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).
  • 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)

  1. Allestisci un lab con Windows Server e livello funzionale allineati alla produzione.
  2. Forza la creazione dei GPO predefiniti e copia GptTmpl.inf della DDCP.
  3. Recupera il DomainSID reale e sostituiscilo nel file (lasciando i RID intatti).
  4. Esegui un backup della cartella SecEdit in produzione, poi sovrascrivi GptTmpl.inf.
  5. Incrementa la versione del GPO (opzionale), replica e verifica con gpupdate, dcdiag e repadmin.

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

  1. Backup regolare dei GPO con GPMC (Backup) o PowerShell (Backup-GPO) verso una share esterna a SYSVOL.
  2. 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.
  3. Lab permanente: testa patch e cambiamenti di baseline di sicurezza prima di toccare la produzione, così puoi sempre rigenerare file “puliti”.
  4. 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.

Indice