Migrazione profili roaming su nuovi controller di dominio: guida operativa completa (AD, GPO, Robocopy)

Migrare i profili roaming a un nuovo file server dopo l’introduzione di nuovi controller di dominio richiede precisione: copia senza perdite, aggiornamento in blocco dell’attributo profilePath e continuità ai logon. Questa guida pratica ti accompagna dallo staging al cut‑over, fino ai test e al rollback.

Indice

Scenario e obiettivi

Hai aggiunto nuovi controller di dominio (DC) Windows Server e, parallelamente, stai sostituendo il vecchio file server che ospita i profili roaming. Gli utenti continuano a puntare a \\OldServer\Profiles e desideri spostarli su \\NewServer\Profiles$ garantendo:

  • nessuna perdita di dati, permessi o impostazioni;
  • aggiornamento massivo del percorso profilo in Active Directory (AD) e, dove necessario, via Group Policy (GPO);
  • downtime minimo e rollback semplice.

Prerequisiti e considerazioni

  • Finestra di manutenzione: identifica un periodo di bassa attività per la copia iniziale e il delta finale.
  • Permessi amministrativi: su entrambi i file server (Backup/Restore Files and Directories se usi /B o /ZB in Robocopy) e privilegi di modifica degli utenti in AD.
  • Capacità e performance: spazio sufficiente su \\NewServer, rete stabile (idealmente 10GbE) e antivirus configurato per non interferire durante la copy window.
  • Compatibilità profilo: i profili Windows possono avere suffissi (es. .V2, .V6) in base alla versione del sistema operativo. La migrazione è folder‑level e trasparente, ma verifica coerenza OS‑target.
  • Offline Files: per le share di profilo imposta “Non rendere disponibili offline” per evitare conflitti con CSC.
  • DFS Namespace (consigliato): pubblicare i profili come \\dominio.local\Profili$\%username% svincola in futuro dal nome del server.

Architettura consigliata della share

Struttura tipica:

\\NewServer\Profiles$
 ├─ <username>
 │   ├─ AppData
 │   ├─ Desktop
 │   └─ ...

Permessi NTFS (root della share Profiles$):

  • SYSTEM, Administrators: Full Control (questa cartella, sottocartelle e file);
  • CREATOR OWNER: Full Control (solo sottocartelle e file);
  • Nessun permesso “Users” o “Authenticated Users” sul root (evita listing non necessario);
  • le sottocartelle utente avranno Full Control all’account proprietario.

Permessi di condivisione: Authenticated Users o Everyone Full Control (controlla l’accesso con NTFS). Attiva l’opzione “Nessun file è disponibile offline”.

Piano operativo passo‑passo

FaseAzioneDettagli pratici
BackupSalva tutti i dati utenteSnapshot o copia completa della share \\OldServer\Profiles su storage esterno.
Predisporre il nuovo server1) Crea \\NewServer\Profiles$.
2) Replica i permessi NTFS e share (SYSTEM, Administrators, UTENTE Full Control, CREATOR OWNER).
Evita errori di accesso post‑cut‑over.
Copia dei profiliEsegui Robocopy in orario di bassa attività (prima passata completa):robocopy "\\OldServer\Profiles" "\\NewServer\Profiles" /MIR /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /MT:32 /XJ /LOG:"C:\Logs\ProfileMigration-1.log" /TEE Facoltativa una seconda esecuzione “delta” poco prima dello switch: robocopy "\\OldServer\Profiles" "\\NewServer\Profiles" /MIR /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /MT:32 /XJ /XO /XX /LOG:"C:\Logs\ProfileMigration-Delta.log" /TEE Note: /MIR mantiene la struttura; /COPYALL preserva ACL, attributi e timestamp; /SECFIX riallinea i permessi; /DCOPY:DAT copia attributi directory; /XJ evita loop su giunzioni (es. “Application Data”); /MT velocizza. Valuta /ZB se servono privilegi di backup.
Aggiornare il percorso profiloa) ADUC: selezione multipla → Proprietà → Profilo → aggiorna percorso.
b) PowerShell (bulk consigliato, vedi script sotto).
c) GPO: System → User Profiles → Set roaming profile path… (se usi profilo via criterio per computer).
Assicura che i nuovi logon usino \\NewServer\Profiles\%username%.
Verifica permessiControlli ACL e test di accessoicacls "\\NewServer\Profiles" /verify /c Esegui un logon di test con un utente pilota.
Test pilota2–3 utenti realiConferma tempi di accesso, integrità dati, sincronizzazione. Individua eventuali file bloccati o app che salvano fuori profilo.
Comunicazione & cut‑overInforma gli utenti e pianifica il delta finaleRichiedi disconnessione entro l’orario stabilito per ridurre file aperti.
PuliziaDecommissiona il vecchio percorsoDopo una settimana senza issue, rendi la vecchia share sola‑lettura o dismettila.

Script PowerShell di migrazione (bulk) dell’attributo profilePath

Questo script cerca gli utenti con ProfilePath che puntano al vecchio server e aggiorna in sicurezza il percorso. Prevede dry‑run (simulazione) e log CSV.

# Parametri
$OldServer = "OldServer"
$NewServer = "NewServer"
$OldRoot   = "\\$OldServer\Profiles"
$NewRoot   = "\\$NewServer\Profiles"
$Report    = "C:\Logs\AD-ProfilePath-Changes.csv"
$DoIt      = $false   # imposta $true per applicare

Import-Module ActiveDirectory

Cerca solo account abilitati con ProfilePath valorizzato che contiene il vecchio server

$users = Get-ADUser -LDAPFilter "(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(profilePath=*))" -Properties profilePath,samAccountName,distinguishedName |
Where-Object { $_.profilePath -match [regex]::Escape($OldServer) }

Prepara il report

$results = foreach ($u in $users) {
$old = $u.profilePath
if ([string]::IsNullOrWhiteSpace($old)) { continue }
$new = $old -replace [regex]::Escape($OldServer), $NewServer
```
if ($DoIt) {
    try {
        Set-ADUser -Identity $u.DistinguishedName -ProfilePath $new -ErrorAction Stop
        [pscustomobject]@{ SamAccountName=$u.SamAccountName; Old=$old; New=$new; Status="Updated" }
    } catch {
        [pscustomobject]@{ SamAccountName=$u.SamAccountName; Old=$old; New=$new; Status="Error: $($_.Exception.Message)" }
    }
} else {
    [pscustomobject]@{ SamAccountName=$u.SamAccountName; Old=$old; New=$new; Status="DryRun" }
}
```
}

$results | Sort-Object SamAccountName | Tee-Object -FilePath $Report | Out-Null
Write-Host "Completato. Report: $Report" 

Consigli: escludi eventuali service account, OU specifiche o gruppi con filtri mirati; conserva sempre un report firmato del cambio per audit.

Alternativa con criterio GPO

Se i profili vengono imposti via criterio “Imposta il percorso del profilo mobile per tutti gli utenti che effettuano l’accesso a questo computer”, puoi:

  1. Creare un nuovo GPO con il nuovo percorso (es. \\NewServer\Profiles\%username%).
  2. Linkarlo alle OU dei computer interessati e pianificare un gpupdate /force fuori orario.
  3. Rimuovere poi eventuali impostazioni duplicate lato utente (attributo in AD) per evitare conflitti.

Convalida post‑migrazione

  • Event Viewer sui client: Application → User Profile Service. Attenzione a eventi 1509, 1511, 1521 (errori di caricamento/percorsi non raggiungibili).
  • Verifica apertura file sul nuovo server: Get-SmbOpenFile per individuare file bloccati e utenti attivi.
  • ACL sanity check: icacls "\\NewServer\Profiles<username>"
  • Tempi di logon: misura prima/dopo con 2–3 utenti pilota e annota la differenza; se elevata, valuta esclusioni o Folder Redirection.

Ottimizzazioni consigliate

DFS Namespaces

Pubblica i profili come \\dominio.local\Profili$\%username% e punta questo namespace alla share del file server attuale. In futuro potrai spostare i target senza toccare l’attributo in AD.

Folder Redirection / OneDrive

Reindirizzare Desktop, Documenti e Immagini (o usare KFM/OneDrive) riduce il peso del profilo, migliorando i tempi di accesso. Evita di far “roamare” cache e contenuti sincronizzati localmente.

Esclusioni dal profilo

Valuta la policy “Escludi cartelle dall’intero profilo” per cache volatili (es. AppData\Local\Temp, cache di browser). Meno dati nel profilo = logon più rapidi.

Quote, auditing e backup

  • Applica quote (FSRM) per prevenire crescita incontrollata.
  • Abilita auditing su modifiche critiche.
  • Verifica la schedulazione dei backup e i restore test su profili utente.

Troubleshooting mirato

ProblemaDiagnosi rapidaRisoluzione
Errore “profilo temporaneo”Eventi 1511/1515; cartella profilo non raggiungibile o permessi errati.Ricontrolla ACL su \\NewServer\Profiles\%username% e ownership; verifica raggiungibilità SMB e credenziali.
File in uso durante la copiaRobocopy log segnala “in uso”.Esegui delta finale a utenti disconnessi; usa /R:3 /W:5; in caso estremo, chiudi handle con Get-SmbOpenFile/Close-SmbOpenFile (con cautela).
Tempi di logon lunghiMolti MB in AppData; rete lenta.Escludi cartelle cache; abilita Folder Redirection; verifica MTU/SMB e antivirus.
Permessi “ereditati” anomaliicacls /verify fallisce su alcune sottocartelle.Riallinea con icacls <path> /inheritance:e /grant:r ... o ripeti Robocopy con /SECFIX.
Profili multipli per stesso utenteCoesistono <user> e <user>.V6.È normale tra versioni OS diverse. Mantieni entrambi se necessari; verifica nei client quale versione viene caricata.

Controlli di qualità sui log Robocopy

Analizza i log per errori e file non copiati. Esempio di estrazione rapida:

$log = Get-Content "C:\Logs\ProfileMigration-1.log"
$errors = $log | Select-String -Pattern "ERROR|Access is denied|In Use|0x"
$errors | Set-Content "C:\Logs\ProfileMigration-Errors.txt"

Per una terza passata “mirata” solo su file cambiati o saltati:

robocopy "\\OldServer\Profiles" "\\NewServer\Profiles" /E /COPYALL /SECFIX /XO /XX /R:2 /W:3 /XJ /LOG:"C:\Logs\ProfileMigration-Fixup.log" /TEE

Checklist essenziale

  • Snapshot/completo della share originaria.
  • Creazione Profiles$ su NewServer con ACL corretti.
  • Robocopy passata 1 (completa) + passata delta prima del cut‑over.
  • Script AD in dry‑run → revisione → applicazione.
  • Test pilota con 2–3 utenti e validazione Event Viewer.
  • Comunicazione agli utenti e finestra di disconnessione.
  • Monitoraggio post‑migrazione e cleanup del vecchio percorso.

Modello di comunicazione agli utenti

Oggetto: Manutenzione profili utente – Migrazione file server

Gentile utente,
venerdì dalle 19:00 alle 21:00 migreremo i profili al nuovo server.
Per evitare perdite di dati, ti chiediamo di:
* salvare e chiudere i documenti;
* disconnetterti entro le 18:55;
* non accedere durante la finestra indicata.

Dopo le 21:00 potrai accedere normalmente.
Grazie per la collaborazione. 

Appendice: comandi e procedure utili

Verificare l’owner e correggerlo

# Imposta l'owner della cartella profilo all'utente
$Path = "\\NewServer\Profiles\j.rossi"
takeown /F "$Path" /R /D Y | Out-Null
icacls "$Path" /setowner "DOMINIO\j.rossi" /T

Elenco utenti che puntano ancora al vecchio percorso

Import-Module ActiveDirectory
Get-ADUser -LDAPFilter "(profilePath=*)" -Properties profilePath |
 Where-Object { $_.profilePath -match "OldServer" } |
 Select-Object SamAccountName,profilePath |
 Export-Csv "C:\Logs\Users-Still-On-OldServer.csv" -NoTypeInformation

Individuare handle aperti sulla share

Get-SmbOpenFile | Where-Object { $_.Path -like "\Profiles\" } | 
 Select-Object ClientUserName,Path,SessionId,ContinuouslyAvailable,LockCount

Forzare l’aggiornamento criteri

Invoke-Command -ComputerName (Get-ADComputer -Filter * | Select -Expand Name) -ScriptBlock { gpupdate /force }

Strategia di rollback

Se dopo il cut‑over emergono problemi diffusi:

  1. Imposta temporaneamente in AD il vecchio profilePath per gli utenti impattati (usa il medesimo script invertendo $OldServer e $NewServer).
  2. Se necessario, rendi \\OldServer\Profiles nuovamente scrivibile.
  3. Investiga i log Robocopy e gli eventi profilo; correggi permessi e ripeti la copia mirata.
  4. Pianifica un nuovo delta e riprova con un lotto più piccolo di utenti.

Domande frequenti

Serve usare %USERNAME% nel percorso AD?
È comodo quando vuoi gestire il percorso in modo standardizzato (es. \\NewServer\Profiles\%username%). In alternativa puoi impostare un path esplicito per utente.

/MIR è rischioso?
Usalo con cognizione: replica eliminazioni. Esegui sempre un backup e una passata “dry” (con /L per simulare) se desideri vedere cosa accadrà.

Meglio GPO o attributo AD?
Dipende dal tuo design. L’attributo in AD è per‑utente e più granulare; la GPO per‑computer è utile in ambienti RDS o lab.

Gli amministratori devono poter leggere i profili?
Per privacy potresti limitare la lettura diretta; mantieni comunque la possibilità di take ownership in emergenza.

Riepilogo operativo (one‑shot)

  1. Backup di \\OldServer\Profiles.
  2. Creazione \\NewServer\Profiles$ con ACL/Share corretti.
  3. Robocopy completa + delta.
  4. Aggiornamento massivo profilePath via PowerShell (log CSV).
  5. Test pilota e controlli Event Viewer.
  6. Comunicazione, cut‑over, monitoraggio.
  7. Pulizia e dismissione del vecchio percorso.

Perché questa procedura funziona

La combinazione “Robocopy con preservazione completa” + “aggiornamento atomico del percorso in AD/GPO” consente una migrazione a impatto minimo. La doppia passata (completa + delta) riduce il rischio di file in uso, mentre i test pilota e i controlli mirati su ACL, eventi e handle aperti intercettano i problemi prima che diventino incidenti su larga scala. Integrare DFS, esclusioni di cartelle e Folder Redirection renderà le prossime migrazioni ancora più semplici o addirittura invisibili agli utenti.


Appendice: versione compatta della procedura (stampabile)

  1. Backup: snapshot/copia della share originale.
  2. Nuova share: crea \\NewServer\Profiles$, imposta ACL/Share, disabilita Offline Files.
  3. Robocopy #1: /MIR /COPYALL /SECFIX /MT /XJ.
  4. Robocopy #Delta: /XO /XX, utenti disconnessi.
  5. AD: script bulk su profilePath (dry‑run → apply), report CSV.
  6. Test: 2–3 utenti + Event Viewer 1509/1511/1521.
  7. Cut‑over: comunicazione, gpupdate, monitoraggio.
  8. Pulizia: vecchia share read‑only → decom.

Materiale pronto all’uso

Comando Robocopy consigliato (riassunto)

robocopy "\\OldServer\Profiles" "\\NewServer\Profiles" /MIR /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /MT:32 /XJ /LOG:"C:\Logs\ProfileMigration.log" /TEE

Snippet PowerShell per aggiornamento AD (one‑liner)

Get-ADUser -LDAPFilter "(profilePath=*)" -Properties profilePath |
 ? { $_.profilePath -like "OldServer" } |
 % { Set-ADUser $ -ProfilePath ($.profilePath -replace "OldServer","NewServer") }

Verifica rapida permessi

icacls "\\NewServer\Profiles" /verify /c

Controllo eventi profilo

Get-WinEvent -FilterHashtable @{LogName="Application"; ProviderName="User Profile Service"; StartTime=(Get-Date).AddDays(-1)} |
 Select TimeCreated,Id,LevelDisplayName,Message

Seguendo questi passaggi ottieni una migrazione “in un colpo solo” dei profili roaming, preservando dati, permessi e continuità operativa. La procedura è pensata per essere ripetibile, auditabile e sicura anche in domini di grandi dimensioni.

Indice