Migração segura e sem perdas de perfis móveis (Roaming Profiles) do Windows: neste guia prático, você vai copiar os dados, ajustar permissões e atualizar o caminho no Active Directory/GPO com mínimo downtime, usando Robocopy, PowerShell e boas práticas como DFS e políticas de perfil.
Visão geral da pergunta
Após migrar os controladores de domínio do Windows Server, os caminhos de perfil móvel dos utilizadores continuam a apontar para o servidor antigo. Como migrar todos os perfis de uma só vez — sem perda de dados e sem quebrar definições — e atualizar o caminho de perfil para o novo servidor?
Resposta curta: trate a migração em três frentes e na ordem certa: dados (Robocopy em duas passagens), caminho no AD/GPO (atualização em massa) e políticas/permissões (GPOs e ACLs corretas). O fluxo abaixo minimiza paragens e riscos.
Estratégia de migração em três frentes
- Dados: copie primeiro em modo “pré-semente” para reduzir o delta, e depois faça o cut‑over com os utilizadores desligados.
- Caminho: atualize Profile Path (e Terminal Services Profile Path, se usado) no AD ou via GPO único.
- Políticas/Permissões: garanta permissões padrão, cache offline desativado na partilha, GPOs de perfil e rede no logon.
Procedimento recomendado (resumo)
Preparar e agendar
- Faça backup completo da partilha de perfis (incluindo ACLs e shadow copies, se existentes).
- Agende uma janela de manutenção com todos os utilizadores offline (sem sessões locais/RDP abertas).
- Confirme que a replicação do AD finalizou em todos os novos DCs.
- Valide se há espaço em disco suficiente no novo servidor e se o volume está com 8.3 names e long paths habilitados conforme sua política.
- Se houver antivírus no servidor de ficheiros, exclua o caminho da partilha de perfis de real-time scanning para reduzir bloqueios.
Provisionar a nova partilha de perfis
Crie a partilha (por exemplo, \\NOVO-SRV\Profiles$
) com cache offline desativado e aplique ACLs canónicas para Roaming Profiles.
Escopo | Privilégios recomendados | Observações |
---|---|---|
Partilha (SMB) | Everyone = Full Control (ou) Authenticated Users = Change/Read | Controle real deve ser feito no NTFS. Defina o cache offline como “No files or programs from the share are available offline”. |
NTFS – Raiz Profiles$ | Administrators, SYSTEM = Full Control Creator Owner = Full Control (Subpastas/ficheiros) Users/Authenticated Users = List Folder + Create Folders/Append Data (somente nesta pasta) | Permite que o Windows crie \\...\Profiles$\username com ACLs adequadas no primeiro logon. |
NTFS – Pasta do utilizador | Utilizador (apenas ele), Administrators, SYSTEM = Full Control | Nunca atribua acesso a outros utilizadores ou grupos genéricos. |
Copiar os dados do servidor antigo para o novo (duas passagens)
Pré-semente (com utilizadores ainda ativos para reduzir delta):
robocopy \\ANTIGO-SRV\Profiles$ \\NOVO-SRV\Profiles$ /E /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /ZB /MT:16 /XJ /LOG:RoamingProfiles_Seed.log
/E
: copia incluindo pastas vazias./COPYALL
+/SECFIX
: preserva dados e segurança (DACL/SACL/owner)./DCOPY:DAT
: preserva data/atributos de diretórios./ZB
: modo reiniciável; cai para modo backup se necessário./MT:16
: cópia multithread (ajuste conforme CPU/IO)./XJ
: evita seguir junctions e loops.
Cut‑over (com todos desligados):
robocopy \\ANTIGO-SRV\Profiles$ \\NOVO-SRV\Profiles$ /MIR /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /ZB /MT:16 /XJ /LOG:RoamingProfiles_Cutover.log
/MIR
: espelha e elimina no destino o que não existe na origem (use apenas no cut‑over).- Para NAS/SMB com marcas de tempo não exatas, considere
/FFT
.
Como interpretar os códigos de saída do Robocopy (útil para automação/CI):
Código | Significado | Ação |
---|---|---|
0 | Nada copiado | OK |
1 | Ficheiros copiados com sucesso | OK |
2–7 | Diferenças/alterações/erros recuperáveis | Revisar logs |
≥8 | Erros significativos | Falha — investigar |
Atualizar o caminho de perfil no Active Directory (em massa)
Se você usa o atributo Profile Path no AD, atualize em lote com PowerShell (RSAT/Módulo AD):
Import-Module ActiveDirectory
$old = '\\ANTIGO-SRV\Profiles$'
$new = '\\NOVO-SRV\Profiles$'
Get-ADUser -Filter \* -SearchBase 'OU=Users,DC=contoso,DC=local' -Properties ProfilePath,HomeDirectory,TerminalServicesProfilePath |
ForEach-Object {
\$changed = \$false```
if ($_.ProfilePath -and $_.ProfilePath -like "$old*") {
$pp = $_.ProfilePath -replace [regex]::Escape($old), $new
Set-ADUser $_ -ProfilePath $pp
$changed = $true
}
# Se usar perfil de RDS/Terminal Services, atualize também:
if ($_.TerminalServicesProfilePath -and $_.TerminalServicesProfilePath -like "$old*") {
$ts = $_.TerminalServicesProfilePath -replace [regex]::Escape($old), $new
Set-ADUser $_ -Replace @{TerminalServicesProfilePath = $ts}
$changed = $true
}
# (Opcional) Se existir Home Folder na mesma partilha, ajuste:
if ($_.HomeDirectory -and $_.HomeDirectory -like "$old*") {
$hd = $_.HomeDirectory -replace [regex]::Escape($old), $new
Set-ADUser $_ -HomeDirectory $hd
$changed = $true
}
if ($changed) { Write-Host "Atualizado:" $_.SamAccountName }
```
}
Use caminhos do tipo \\Servidor\Profiles$\%username%
. O Windows aplicará automaticamente a versão de perfil (.Vx
) conforme o SO do cliente.
Alternativa via GPO (escopo por computador): Computer Configuration → Policies → Administrative Templates → System → User Profiles → Set roaming profile path for all users logging onto this computer. Defina \\NOVO-SRV\Profiles$\%username%
(ou, idealmente, um namespace DFS — veja mais abaixo).
Políticas e comportamento no logon
- (Opcional, para higiene) Delete cached copies of roaming profiles após o cut‑over (ou depois de verificar estabilidade).
- Ative Wait for network at computer startup and logon para garantir que o caminho de rede está disponível antes do perfil.
- Considere Set maximum wait time for the network if a user has a roaming user profile se houver links lentos.
Testar, validar e informar
- Teste com 2–3 contas piloto: logon, criar/editar ficheiros em Ambiente de Trabalho/Documentos, logoff, logon noutro PC.
- Valide permissões nas novas pastas dos utilizadores e confira o tempo de carregamento.
- Comunique a mudança e peça logoff no horário combinado. Tenha um canal de suporte aberto para incidentes.
Melhor prática para o futuro
Para evitar renomear servidores ou alterar caminhos novamente, use DFS Namespace, por exemplo \\contoso.local\Profiles\%username%
apontando para o servidor atual. Em futuras migrações, apenas reapontará o alvo do DFS para o novo servidor, sem tocar no AD/GPO. Em ambientes com vários sites, considere DFS Replication para resiliência (evite replicar live perfis entre sites de latência alta sem planeamento — avalie filtros e janelas).
Retenção e rollback
- Mantenha o servidor antigo em read‑only por alguns dias para auditoria/rollback.
- Guarde os relatórios de cópia (
RoamingProfiles_*.log
) e event logs de clientes (User Profile Service).
Dicas e notas importantes
- Perfis móveis são tecnologia legada. Sempre que possível, reduza dependência:
- Use OneDrive Known Folder Move (KFM) para Documentos/Imagens/Área de Trabalho.
- Em VDI/pooled, prefira FSLogix a Roaming Profile (melhor desempenho e fiabilidade).
- Controlador de domínio ≠ servidor de ficheiros. São funções distintas; migrar DCs não migra partilhas de perfis automaticamente.
- Ao usar
/MIR
, certifique-se de estar na janela de cut‑over: o espelho pode eliminar ficheiros “extras” no destino. - Verifique também o atributo Terminal Services Profile Path se utilizar RDS/Remote Desktop Services.
- Use
%username%
no caminho do perfil; o Windows cria a pasta e aplica o sufixo.Vx
conforme a versão do cliente. - Desative Offline Files/CSC para a partilha de perfis (caching disabled), evitando conflitos.
- Evite redirecionar
AppData(Roaming)
em ambientes sensíveis a latência; se necessário, use exclusões de pastas pesadas (cache do navegador, Teams, etc.). - Aplique quotas e triagens com FSRM para impedir que perfis cresçam indefinidamente.
Checklist de validação rápida
- [ ] Backup validado da partilha antiga
- [ ] Nova partilha criada com permissões corretas
- [ ] Robocopy pré-semente concluído sem erros críticos
- [ ] Utilizadores desligados no cut‑over
- [ ] Robocopy
/MIR
de cut‑over concluído - [ ] ProfilePath (e, se aplicável, TerminalServicesProfilePath) atualizado em AD
- [ ] Testes de logon/logoff OK em múltiplas máquinas
- [ ] Comunicação enviada aos utilizadores
- [ ] Manter servidor antigo read‑only por curto período
Comandos de referência (prontos a usar)
Pré-semente:
robocopy \\ANTIGO-SRV\Profiles$ \\NOVO-SRV\Profiles$ /E /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /ZB /MT:16 /XJ /LOG:RoamingProfiles_Seed.log
Cut‑over:
robocopy \\ANTIGO-SRV\Profiles$ \\NOVO-SRV\Profiles$ /MIR /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /ZB /MT:16 /XJ /LOG:RoamingProfiles_Cutover.log
Atualização em massa do caminho de perfil no AD (PowerShell):
Import-Module ActiveDirectory
$old='\\ANTIGO-SRV\Profiles$'; $new='\\NOVO-SRV\Profiles$'
Get-ADUser -Filter * -Properties ProfilePath |
Where-Object { $_.ProfilePath -like "$old*" } |
ForEach-Object {
$pp = $_.ProfilePath -replace [regex]::Escape($old), $new
Set-ADUser $_ -ProfilePath $pp
}
Modelo de script “fim-a-fim” com validações
Use este script como base para automatizar verificações e atualização em massa (idempotente e com WhatIf opcional):
Param(
[Parameter(Mandatory=$true)][string]$SearchBase = 'OU=Users,DC=contoso,DC=local',
[Parameter(Mandatory=$true)][string]$OldRoot = '\\ANTIGO-SRV\Profiles$',
[Parameter(Mandatory=$true)][string]$NewRoot = '\\NOVO-SRV\Profiles$',
[switch]$UpdateTSProfile,
[switch]$UpdateHome,
[switch]$WhatIf
)
Import-Module ActiveDirectory
\$users = Get-ADUser -Filter \* -SearchBase \$SearchBase -Properties ProfilePath,TerminalServicesProfilePath,HomeDirectory
\$report = foreach(\$u in \$users){
\$ppOld = \$u.ProfilePath
\$ppNew = \$null
\$tsOld = \$u.TerminalServicesProfilePath
\$tsNew = \$null
\$hdOld = \$u.HomeDirectory
\$hdNew = \$null
\$changed = \$false
if(\$ppOld -and \$ppOld -like "\$OldRoot\*"){
\$ppNew = \$ppOld -replace \[regex]::Escape(\$OldRoot), \$NewRoot
if(-not \$WhatIf){ Set-ADUser \$u -ProfilePath \$ppNew }
\$changed = \$true
}
if(\$UpdateTSProfile -and \$tsOld -and \$tsOld -like "\$OldRoot\*"){
\$tsNew = \$tsOld -replace \[regex]::Escape(\$OldRoot), \$NewRoot
if(-not \$WhatIf){ Set-ADUser \$u -Replace @{ TerminalServicesProfilePath = \$tsNew } }
\$changed = \$true
}
if(\$UpdateHome -and \$hdOld -and \$hdOld -like "\$OldRoot\*"){
\$hdNew = \$hdOld -replace \[regex]::Escape(\$OldRoot), \$NewRoot
if(-not \$WhatIf){ Set-ADUser \$u -HomeDirectory \$hdNew }
\$changed = \$true
}
\[pscustomobject]@{
SamAccountName = \$u.SamAccountName
ProfilePath\_Old = \$ppOld
ProfilePath\_New = \$ppNew
TSProfile\_Old = \$tsOld
TSProfile\_New = \$tsNew
HomeDir\_Old = \$hdOld
HomeDir\_New = \$hdNew
Changed = \$changed
}
}
\$report | Sort-Object Changed -Descending | Format-Table -AutoSize
Erros comuns e como resolver
Sintoma | Causa provável | Correção |
---|---|---|
Perfil carrega como temporário | Permissões incorretas na pasta do utilizador ou caminho inacessível | Reaplique ACLs padrão; verifique acessos de Administrators/SYSTEM e do próprio utilizador; valide o caminho UNC/DFS. |
Sincronização muito lenta | Perfil gigante (cache de apps) | Defina exclusões de pastas pesadas via GPO; mova dados para OneDrive KFM; considere FSLogix em VDI. |
Falhas intermitentes no logon | Rede não pronta no logon; DNS/SMB/DFS com latência | Ative “Wait for network” e ajuste tempos; verifique DNS/latência de site; prefira alvos DFS locais por site. |
Robocopy com código ≥ 8 | Erros de acesso/lock ou caminho inválido | Revise logs; use /ZB ; execute como conta com direitos de backup; valide exclusões de antivírus. |
Conflitos entre perfis de versões diferentes | Mesma pasta usada por clientes com versões distintas | Garanta uso de \\...\Profiles$\%username% ; o Windows aplica .Vx automaticamente e evita colisões. |
Validações pós-migração que não podem faltar
- Execute
gpresult /h c:\temp\gp.html
em 2–3 máquinas e valide as políticas de perfis. - No Event Viewer do cliente, confirme que o User Profile Service não registra erros 1509/1511/1542.
- Abra/feche sessão em dois computadores diferentes para o mesmo utilizador e confirme persistência de alterações.
- Use
icacls \\NOVO-SRV\Profiles$\%username%
para inspeção rápida de ACLs.
Considerações avançadas
- Namespace DFS desde o início: crie
\\domínio.local\Profiles\%username%
e mapeie o alvo para o servidor atual. Na próxima migração, só ajuste o alvo. - Vários sites: tenha alvos DFS por site e utilize site costing; evite perfis atravessando WAN.
- FSRM: aplique quotas pedagógicas (ex.: 5–10 GB) e triagens para impedir ficheiros .ISO/.PST gigantes no perfil.
- Antivírus/EDR no servidor: exclua
Profiles$
de tempo real; mantenha verificação programada fora do expediente. - Redirecionamento de pastas: se já usa, alinhe ordens de processamento com Roaming Profile para evitar “ping‑pong” de dados.
- Logs e auditoria: guarde
RoamingProfiles_*.log
, relatórios do script e um snapshot das ACLs (icacls /save
).
Plano “rápido” altamente controlado
- Pré-semente com Robocopy durante o expediente.
- Comunicar janela de cut‑over e forçar logoff.
- Robocopy
/MIR
para fechar delta. - Atualizar Profile Path (e TS Profile, se aplicável) via script.
- Aplicar GPOs de perfil/rede e limpar cache local (quando decidido).
- Testes em 2–3 contas e monitorização por 24–72h.
FAQ essenciais
Posso migrar com utilizadores ligados? Tecnicamente, a pré-semente sim; o cut‑over deve ser com todos desligados para garantir integridade e evitar conflitos.
E se algum utilizador não tiver Profile Path definido no AD? Se usa GPO de perfil por computador, o caminho será o da GPO. Caso contrário, defina o atributo no AD ou passe a usar GPO.
Posso migrar perfis e home folders juntos? Sim, mas trate-os como escopos distintos. Atualize ambos no script, comutando as flags correspondentes.
Quanto ao sufixo .Vx
? Não force. O cliente aplica automaticamente o sufixo conforme a versão. O importante é apontar para \\...\%username%
, não para uma pasta com sufixo fixo.
Exemplo de comunicação para utilizadores
Assunto: Manutenção programada – atualização do servidor de perfis
Olá,
Hoje, das 19h às 20h, vamos atualizar o servidor responsável pelos perfis de utilizador.
Pedimos que grave o seu trabalho e faça logoff até às 18h55.
Após o primeiro logon, caso note alguma lentidão ou ausência de atalhos/documentos, avise o Service Desk.
Obrigado!
Resumo para impressão
- Objetivo: migrar Roaming Profiles sem perda de dados.
- Ferramentas: Robocopy, PowerShell (RSAT/AD), GPO, DFS (opcional mas recomendado).
- Fluxo: Pré-semente → Cut‑over → Atualizar AD/GPO → Validar → Manter antigo read‑only.
- Boas práticas: ACLs canónicas, cache offline desativado, exclusões no antivírus, FSRM/quotas, DFS Namespace.
Conclusão
Seguindo estes passos, você migra todos os perfis para o novo servidor com integridade, atualiza o caminho em AD/GPO e estabelece uma base mais robusta (preferencialmente via DFS), reduzindo dores em futuras trocas de servidor. Perfis móveis atendem a casos legados; quando possível, evolua a estratégia para OneDrive KFM e FSLogix em VDI.
Anexos de referência rápida
Robocopy – Pré-semente
robocopy \\ANTIGO-SRV\Profiles$ \\NOVO-SRV\Profiles$ /E /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /ZB /MT:16 /XJ /LOG:RoamingProfiles_Seed.log
Robocopy – Cut‑over
robocopy \\ANTIGO-SRV\Profiles$ \\NOVO-SRV\Profiles$ /MIR /COPYALL /SECFIX /DCOPY:DAT /R:3 /W:5 /ZB /MT:16 /XJ /LOG:RoamingProfiles_Cutover.log
Atualização em massa do Profile Path
Import-Module ActiveDirectory
$old='\\ANTIGO-SRV\Profiles$'; $new='\\NOVO-SRV\Profiles$'
Get-ADUser -Filter * -Properties ProfilePath |
Where-Object { $_.ProfilePath -like "$old*" } |
ForEach-Object {
$pp = $_.ProfilePath -replace [regex]::Escape($old), $new
Set-ADUser $_ -ProfilePath $pp
}