Миграция профилей с терминального сервера — это как вытаскивать зуб мудрости у Windows: больно, страшно и обязательно с криком «а чё, нельзя было просто скопировать папку?!»
И даже иногда без боли, если знаешь, куда тыкать и где не облажаться. Ниже — проверенные способы, без ереси и шаманства, только мясо прокручивай, как говорится.
Что мы вообще мигрируем?
Мы говорим про профили пользователей на терминальном сервере (RDS, Remote Desktop Services).
А значит, нам нужно утащить:
- %USERPROFILE% (вся папка профиля)
- Скрытые файлы вроде NTUSER.DAT (чтобы были настройки, а не свежая голая оболочка)
- AppData (и local, и roaming)
- Ну и не профакапить права, потому что потом юзер не сможет даже обои поменять
Способ №1: User Profile Wizard (Forensit)
🛠 Это не реклама, а признание в любви. Если хочешь мигрировать без кровавых жертв — используй User Profile Wizard.
Как это работает:
- Качаем User Profile Wizard с сайта ForensIT (бесплатная версия хватает на всё)
- Запускаем на новом сервере, где юзер уже логинился хотя бы раз
- Указываем, откуда мигрировать профиль (C:\Users\OldProfile)
- Присваиваем его новому пользователю (например, DOMAIN\newuser)
Он автоматически:
- переносит профиль
- переименовывает SID
- прописывает в реестре
- даёт права
и - ОЧЕНЬ РЕДКО КОГДА ЧТО_ТО ЛОМАЕТ
После этого: юзер заходит — и у него всё, как на старом сервере.
Почему круто:
- Без ручного реестра
- Без битых ссылок
- Без ломки прав
- Работает быстро и красиво
- Профиль не становится "TEMP"
Способ №2: Ручками через одно место, но работает
Если хочешь побольше собрать опыта, как админ-аскет на горе — welcome to manual mode.
Что делать:
- На старом сервере:
Заходим под админом
Копируем папку C:\Users\USERNAME куда-нибудь (D:\migrated_profiles)
ОБЯЗАТЕЛЬНО включая скрытые и системные файлы
Не забудь NTUSER.DAT, AppData, и всякие .vscode, .ssh, Downloads, даже если они тебе кажутся мусором - На новом сервере:
Создай нового юзера (или залогинься под ним, чтобы создался профиль)
Перезагрузи, чтобы профиль не висел в сессии
Удали его папку профиля (C:\Users\newuser)
Вставь на это место скопированный профиль, ПЕРЕИМЕНОВАННЫЙ как newuser
Присвой владельца:
takeown /f C:\Users\newuser /r /d y
icacls C:\Users\newuser /setowner "DOMAIN\newuser" /t
icacls C:\Users\newuser /grant "DOMAIN\newuser:(OI)(CI)F" /t
Перезагрузи и молись богу SID
Где можно облажаться?
- Забыл NTUSER.DAT → все настройки профиля = в мусор
- Оставил старый SID → профиль работает, но ты не можешь ничего редактировать, а Event Viewer орёт как бешеный хорёк
- Профиль стал TEMP → здравствуй, session hell, пока юзер орёт: “Где мои ярлыки, Петрович?!”
Способ №3: Роуминг через Group Policy + File Server
Если хочешь мигрировать и дальше жить без боли — используй roaming profiles, которые хранятся на сетевом диске и сами ездят с пользователем.
Как это выглядит:
- Настраиваешь GPO:
User Configuration → Policies → Administrative Templates → System → User Profiles
→ Set roaming profile path to: \\filesrv\Profiles\%USERNAME% - Копируешь туда старый профиль (один раз руками или автоматом)
- Юзер заходит на любой терминальный сервер, и его профиль скачивается сам
Но! Это требует немного мозга, и отдельного места под хранение. Но зато больше никогда не будешь вручную переносить ярлыки и файлы Excel.
Что выбрать?
User Profile Wizard — когда ты любишь себя
Ручками через боль — когда ты мазохист или в офлайне тебе стало совсем скучно
Roaming profiles — когда ты хочешь автоматизацию как у SkyNet
А если профили ранее уже были скопированы твоим напарником, который забухал и теперь надо лишь актуализировать данные?
Ну, брат, тогда добро пожаловать в мир дифференциальной синхронизации, где царит порядок, скорость и никакой боли от NTUSER.DAT!
Цель
Ты уже один раз скопировал папки профилей, теперь хочешь:
- Не затирать то, что уже есть (чтобы не порушить, если кто-то уже там поработал)
- Притащить только новые/изменённые файлы
- Не схлопотать «TEMP» при входе
- Сделать это быстро и по-людски
Решения на выбор
1. robocopy – король синхронизации без церемоний
Windows-админы знают: если тебе нужно "сделать как надо" — robocopy выезжает на бронетехнике и делает дело.
robocopy "\\old-ts\Users\USERNAME" "C:\Users\USERNAME" /MIR /Z /XA:SH /R:2 /W:2 /COPYALL /XJ /NFL /NDL /LOG:C:\sync.log
Пояснение флагов:
- /MIR – зеркало: копирует новые и удаляет старые (⚠️ осторожно!)
- /Z – копирует в перезапускаемом режиме
- /XA:SH – исключает скрытые и системные файлы (если нужно)
- /COPYALL – сохраняет права, владельцев, метки времени
- /XJ – исключает символические ссылки (во избежание петли ада)
- /NFL /NDL – не выводит список файлов и директорий (чтобы лог был чище)
- /LOG – сохраняет лог (для паранойи)
Если ты НЕ хочешь удалять файлы, используй /E /PURGE вместо /MIR — будет мягче.
2. SyncToy или FreeFileSync – если ты хочешь GUI и графоний
Да, Microsoft когда-то сделала тулзу SyncToy. Да, она древняя. Да, она всё ещё работает.
FreeFileSync — то же самое, но в XXI веке.
Как это делается:
- Ставишь
- Указываешь source и destination
- Выбираешь режим "Update"
- Прогоняешь анализ — и только потом жмёшь "Sync"
Подходит, если ты хочешь визуально убедиться, что не гробишь профили юзеров (я надеюсь у тебя все-таки есть бэкап, ведь да? а то всяко бывает, особенно с VIPами).
3. PowerShell + Get-ChildItem + Copy-Item — если ты хочешь скриптовать красиво
Вот пример скрипта:
$source = "\\old-ts\Users\USERNAME"
$dest = "C:\Users\USERNAME"
$files = Get-ChildItem -Path $source -Recurse -Force
foreach ($file in $files) {
$target = $file.FullName.Replace($source, $dest)
if (!(Test-Path $target) -or ($file.LastWriteTime -gt (Get-Item $target).LastWriteTime)) {
Copy-Item $file.FullName $target -Force
}
}
💡 Он тащит только изменённые или отсутствующие файлы.
А что с NTUSER.DAT?
- НЕ ТРОГАЙ, если профиль уже используется на новом сервере.
- Это ядро пользовательских настроек. Если заменишь — будет хардкорный откат в прошлое.
- Если прям нужно его обновить — делай это только когда профиль НЕ в сессии.
🧨 Можешь использовать утилиту reg load / reg unload, чтобы смонтировать NTUSER.DAT и сравнить что внутри — но это уже путь ситха и не для ДЗЕНа.
А Вот уровень сисадмина с черным поясом:
Если пользователей много — автоматизируй через PowerShell:
$users = Get-ChildItem "\\old-ts\Users" | Where-Object { $_.PSIsContainer }
foreach ($user in $users) {
robocopy "\\old-ts\Users\$($user.Name)" "C:\Users\$($user.Name)" /E /Z /COPYALL /R:2 /W:2 /XJ /LOG+:C:\sync_all.log
}
Важный момент:
- Перед миграцией убей сессии пользователей, чтобы профили не были в использовании (или работай через профильные папки D:\Users)
- Всегда делай бэкап — хотя бы скриптом zip.exe в черную дыру
- Не обновляй то, что уже хорошо работает, без причины — закон админа №1
Финалочка
Миграция профилей — это как пересадка души:
Если делаешь неаккуратно — юзер проснётся в новом теле и закричит: “Где мои закладки в Chrome?!”
А так — всё сработает, если ты не психанёшь и не замажешь NTUSER.DAT на живом профиле.