Migrar perfis móveis (Roaming Profiles) para novos servidores/DCs no Windows Server: guia completo com Robocopy, AD e GPO

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.

Índice

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.

EscopoPrivilégios recomendadosObservações
Partilha (SMB)Everyone = Full Control (ou) Authenticated Users = Change/ReadControle 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 utilizadorUtilizador (apenas ele), Administrators, SYSTEM = Full ControlNunca 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ódigoSignificadoAção
0Nada copiadoOK
1Ficheiros copiados com sucessoOK
2–7Diferenças/alterações/erros recuperáveisRevisar logs
≥8Erros significativosFalha — 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

  1. Teste com 2–3 contas piloto: logon, criar/editar ficheiros em Ambiente de Trabalho/Documentos, logoff, logon noutro PC.
  2. Valide permissões nas novas pastas dos utilizadores e confira o tempo de carregamento.
  3. 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

SintomaCausa provávelCorreção
Perfil carrega como temporárioPermissões incorretas na pasta do utilizador ou caminho inacessívelReaplique ACLs padrão; verifique acessos de Administrators/SYSTEM e do próprio utilizador; valide o caminho UNC/DFS.
Sincronização muito lentaPerfil gigante (cache de apps)Defina exclusões de pastas pesadas via GPO; mova dados para OneDrive KFM; considere FSLogix em VDI.
Falhas intermitentes no logonRede não pronta no logon; DNS/SMB/DFS com latênciaAtive “Wait for network” e ajuste tempos; verifique DNS/latência de site; prefira alvos DFS locais por site.
Robocopy com código ≥ 8Erros de acesso/lock ou caminho inválidoRevise logs; use /ZB; execute como conta com direitos de backup; valide exclusões de antivírus.
Conflitos entre perfis de versões diferentesMesma pasta usada por clientes com versões distintasGaranta 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

  1. Pré-semente com Robocopy durante o expediente.
  2. Comunicar janela de cut‑over e forçar logoff.
  3. Robocopy /MIR para fechar delta.
  4. Atualizar Profile Path (e TS Profile, se aplicável) via script.
  5. Aplicar GPOs de perfil/rede e limpar cache local (quando decidido).
  6. 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
  }
Índice