Un dominio Active Directory si impara costruendolo e rompendolo. Una VM su Proxmox permette di farlo senza rischi: si crea il dominio, si organizzano utenti e computer, si applica una policy di gruppo e, se qualcosa va storto, si torna a uno snapshot. La guida riguarda Windows Server 2022 o 2025 e un laboratorio con un solo controller di dominio e un client. Tutti i nomi e gli indirizzi sono esempi.
Requisiti del laboratorio
La VM ospita il controller di dominio (DC) e servono poche risorse: due vCPU e alcuni GiB di RAM bastano per un dominio senza carico. Sui guest Windows conviene installare i driver VirtIO e il QEMU guest agent, che consente backup consistenti dall'hypervisor. La rete di laboratorio deve essere isolata da quella dei servizi reali, per esempio su una VLAN dedicata.
Prima della promozione servono un nome host definitivo, un indirizzo IP statico e un DNS che punti al server stesso: il nome non si cambia in modo indolore dopo la promozione. Anche l'orario conta, perché Kerberos tollera per impostazione predefinita al massimo cinque minuti di scarto tra DC e client.
| Elemento | Valore d'esempio |
|---|---|
| Dominio | ad.example.com |
| Nome NetBIOS | LAB |
| Nome host del DC | dc1 |
| Indirizzo del DC | 192.0.2.10/24 |
| Gateway | 192.0.2.1 |
Get-NetAdapter
New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 192.0.2.10 -PrefixLength 24 -DefaultGateway 192.0.2.1
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.0.2.10
Rename-Computer -NewName "dc1" -RestartNota
ad.example.com è un dominio riservato alla documentazione. In una rete reale si usa un sottodominio (per esempio ad) di un dominio effettivamente posseduto.
Installazione del ruolo AD DS
Install-WindowsFeature AD-Domain-Services -IncludeManagementToolsIl comando installa il ruolo e gli strumenti di gestione, compreso il modulo PowerShell ActiveDirectory. Il server non è ancora un controller di dominio: manca la promozione.
Promozione a controller di dominio
Scelta del nome di dominio
Il nome va scelto prima: cambiarlo dopo è un'operazione complessa. Non conviene usare il suffisso «local» o altri suffissi inventati: «local» è riservato al multicast DNS (RFC 6762) e genera conflitti di risoluzione con client macOS, Linux e Windows recenti, mentre un suffisso non registrato impedisce di ottenere certificati pubblici e può coincidere con un dominio altrui. La pratica consigliata è un sottodominio di un dominio posseduto, come ad.example.com.
Creazione della foresta
La password della modalità ripristino servizi directory (DSRM) viene richiesta in modo interattivo e non compare mai nello script.
$dsrm = Read-Host -Prompt "Credenziale DSRM" -AsSecureString
Test-ADDSForestInstallation -DomainName "ad.example.com" -InstallDns -SafeModeAdministratorPassword $dsrm
Install-ADDSForest -DomainName "ad.example.com" -DomainNetbiosName "LAB" -InstallDns -SafeModeAdministratorPassword $dsrm -ForceTest-ADDSForestInstallation esegue solo i controlli preliminari, senza modifiche. Install-ADDSForest promuove il server e lo riavvia. I livelli funzionali di foresta e dominio possono restare ai valori predefiniti, cioè quelli massimi supportati dal sistema operativo.
Importante
La credenziale DSRM serve per il ripristino del DC e non si recupera in altro modo: va conservata in un gestore di segreti, non in un file di testo né in uno script.
DNS integrato
Active Directory dipende dal DNS: i client trovano il DC tramite record SRV, per esempio _ldap._tcp.dc._msdcs.ad.example.com, pubblicati dal DC stesso. Con -InstallDns la zona ad.example.com nasce integrata in AD e viene replicata con la directory. Il DNS del DC è il solo che i client del dominio devono usare. La risoluzione dei nomi esterni si delega a un forwarder:
Add-DnsServerForwarder -IPAddress 198.51.100.53
Resolve-DnsName -Name "_ldap._tcp.dc._msdcs.ad.example.com" -Type SRVSe il secondo comando restituisce il record, la registrazione del DC nel DNS è corretta.
OU, utenti e gruppi
I criteri di gruppo si collegano alle unità organizzative (OU), non ai contenitori predefiniti Users e Computers: conviene quindi una struttura propria. I permessi si assegnano ai gruppi, non ai singoli utenti.
$base = "DC=ad,DC=example,DC=com"
New-ADOrganizationalUnit -Name "Laboratorio" -Path $base
New-ADOrganizationalUnit -Name "Utenti" -Path "OU=Laboratorio,$base"
New-ADOrganizationalUnit -Name "Gruppi" -Path "OU=Laboratorio,$base"
New-ADOrganizationalUnit -Name "Computer" -Path "OU=Laboratorio,$base"
New-ADGroup -Name "GG-Tecnici" -GroupScope Global -GroupCategory Security -Path "OU=Gruppi,OU=Laboratorio,$base"
$iniziale = Read-Host -Prompt "Credenziale iniziale per mario.rossi" -AsSecureString
New-ADUser -Name "Mario Rossi" -SamAccountName "mario.rossi" -UserPrincipalName "mario.rossi@ad.example.com" -Path "OU=Utenti,OU=Laboratorio,$base" -AccountPassword $iniziale -ChangePasswordAtLogon $true -Enabled $true
Add-ADGroupMember -Identity "GG-Tecnici" -Members "mario.rossi"Read-Host -AsSecureString evita di scrivere credenziali nello script e nella cronologia della shell. La credenziale deve rispettare la policy del dominio, altrimenti New-ADUser fallisce, e -ChangePasswordAtLogon impone la sostituzione al primo accesso. Lo schema classico assegna gli utenti a gruppi globali e i gruppi globali a gruppi locali di dominio che ricevono i permessi sulle risorse.
Una GPO d'esempio
La GPO dimostrativa disattiva Autoplay su tutte le unità e viene collegata alla sola OU Computer.
New-GPO -Name "Esempio-Disattiva-Autoplay" -Comment "GPO dimostrativa"
Set-GPRegistryValue -Name "Esempio-Disattiva-Autoplay" -Key "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" -ValueName "NoDriveTypeAutoRun" -Type DWord -Value 255
New-GPLink -Name "Esempio-Disattiva-Autoplay" -Target "OU=Computer,OU=Laboratorio,DC=ad,DC=example,DC=com" -LinkEnabled YesSuggerimento
Le GPO nuove si provano su una OU di test, non alla radice del dominio. Sul client, gpupdate /force forza l'applicazione e gpresult /r elenca le GPO effettivamente applicate.
Unione di un client al dominio
Il client deve usare il DC come DNS e deve essere un'edizione di Windows che supporta il join (le edizioni Home no). L'account richiesto da Get-Credential è un utente con i diritti per unire computer al dominio.
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.0.2.10
Add-Computer -DomainName "ad.example.com" -Credential (Get-Credential) -RestartI computer nuovi finiscono nel contenitore Computers: per farli rientrare nell'ambito della GPO vanno spostati nella OU dedicata.
Get-ADComputer -Identity "client1" | Move-ADObject -TargetPath "OU=Computer,OU=Laboratorio,DC=ad,DC=example,DC=com"Verifica
dcdiag /q
Get-ADDomain | Select-Object DNSRoot, NetBIOSName, DomainMode, PDCEmulator
Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, IsGlobalCatalogdcdiag /q mostra solo gli errori: nessun output significa nessun test fallito. Senza /q ogni test riporta l'esito:
Starting test: Connectivity
......................... DC1 passed test ConnectivitySnapshot e backup del controller di dominio
Lo snapshot è comodo prima di una promozione o di un test, ma non è un backup: vive sullo stesso storage della VM e segue la sua sorte.
Attenzione
In un dominio con più DC, riportare un controller a uno stato precedente può causare un USN rollback: la directory del DC ripristinato non si riallinea più con le repliche. Proxmox espone il VM-Generation ID (opzione vmgenid), che i DC Windows usano per accorgersi di un ripristino, ma resta valida la regola di ripristinare un DC solo con una procedura supportata, non con un semplice rollback.
Per un backup applicativo si usa il backup dello stato del sistema, su un volume diverso da quello di sistema:
Install-WindowsFeature Windows-Server-Backup
wbadmin start systemstatebackup -backupTarget:E: -quietIl backup dell'intera VM si affianca a quello dello stato di sistema, non lo sostituisce: la strategia di backup 3-2-1 con Proxmox Backup Server descrive come organizzare copie e verifiche di ripristino. Per osservare il DC nel tempo si può usare windows_exporter, come indicato in monitoraggio con Prometheus e Grafana in un LXC.