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.
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
Fase | Azione | Dettagli pratici |
---|---|---|
Backup | Salva tutti i dati utente | Snapshot o copia completa della share \\OldServer\Profiles su storage esterno. |
Predisporre il nuovo server | 1) 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 profili | Esegui 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 profilo | a) 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 permessi | Controlli ACL e test di accesso | icacls "\\NewServer\Profiles" /verify /c Esegui un logon di test con un utente pilota. |
Test pilota | 2–3 utenti reali | Conferma tempi di accesso, integrità dati, sincronizzazione. Individua eventuali file bloccati o app che salvano fuori profilo. |
Comunicazione & cut‑over | Informa gli utenti e pianifica il delta finale | Richiedi disconnessione entro l’orario stabilito per ridurre file aperti. |
Pulizia | Decommissiona il vecchio percorso | Dopo 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:
- Creare un nuovo GPO con il nuovo percorso (es.
\\NewServer\Profiles\%username%
). - Linkarlo alle OU dei computer interessati e pianificare un gpupdate /force fuori orario.
- 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
Problema | Diagnosi rapida | Risoluzione |
---|---|---|
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 copia | Robocopy 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 lunghi | Molti MB in AppData; rete lenta. | Escludi cartelle cache; abilita Folder Redirection; verifica MTU/SMB e antivirus. |
Permessi “ereditati” anomali | icacls /verify fallisce su alcune sottocartelle. | Riallinea con icacls <path> /inheritance:e /grant:r ... o ripeti Robocopy con /SECFIX . |
Profili multipli per stesso utente | Coesistono <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$
suNewServer
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:
- Imposta temporaneamente in AD il vecchio
profilePath
per gli utenti impattati (usa il medesimo script invertendo$OldServer
e$NewServer
). - Se necessario, rendi
\\OldServer\Profiles
nuovamente scrivibile. - Investiga i log Robocopy e gli eventi profilo; correggi permessi e ripeti la copia mirata.
- 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)
- Backup di
\\OldServer\Profiles
. - Creazione
\\NewServer\Profiles$
con ACL/Share corretti. - Robocopy completa + delta.
- Aggiornamento massivo
profilePath
via PowerShell (log CSV). - Test pilota e controlli Event Viewer.
- Comunicazione, cut‑over, monitoraggio.
- 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)
- Backup: snapshot/copia della share originale.
- Nuova share: crea
\\NewServer\Profiles$
, imposta ACL/Share, disabilita Offline Files. - Robocopy #1:
/MIR /COPYALL /SECFIX /MT /XJ
. - Robocopy #Delta:
/XO /XX
, utenti disconnessi. - AD: script bulk su
profilePath
(dry‑run → apply), report CSV. - Test: 2–3 utenti + Event Viewer 1509/1511/1521.
- Cut‑over: comunicazione, gpupdate, monitoraggio.
- 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.