Перенос терминального сервера: создание пользователей и профилей через CSV и PowerShell
При переносе терминального сервера в другой дата-центр часто возникает типовая задача:
необходимо заново создать пользователей, сформировать их профили и перенести пользовательские данные.
Один из самых простых способов автоматизировать этот процесс — использовать CSV-файл и PowerShell.
1. Подготовка CSV-файла с пользователями
Сначала создадим файл со списком пользователей и паролей.
Пример содержимого файла:
username,password user1,pass1 user2,pass2 user3,pass3
Сохраняем его под именем users.csv в каталог C:\temp.
2. Создание локальных пользователей через PowerShell
Запускаем PowerShell с правами администратора и выполняем следующий скрипт:
$csvPath = "C:\temp\users.csv"
$users = Import-Csv $csvPath
foreach ($u in $users) {
$username = $u.Username
$password = ConvertTo-SecureString $u.Password -AsPlainText -Force
$fullname = $u.FullName
if (-not (Get-LocalUser -Name $username -ErrorAction SilentlyContinue)) {
New-LocalUser `
-Name $username `
-Password $password `
-FullName $fullname `
-Description "Created from CSV" `
-PasswordNeverExpires
Write-Host "Создан пользователь: $username"
}
else {
Write-Host "Пользователь уже существует: $username"
}
}
3. Создание пользовательских профилей
После создания учетных записей необходимо сформировать профили пользователей.
На терминальном сервере профиль создаётся при первом входе пользователя в систему.
Чтобы автоматизировать этот процесс, можно выполнить вход по RDP под каждой учетной записью.
4. Автоматический вход по RDP для создания профилей
С другого компьютера запускаем следующий скрипт (предварительно скопировав туда файл
users.csv и указав IP-адрес сервера):
$server = "192.168.1.10"
$users = Import-Csv "C:\scripts\users.csv"
foreach ($u in $users) {
$username = $u.username
$password = $u.password
cmdkey /generic:TERMSRV/$server /user:$username /pass:$password
Start-Process "mstsc.exe" -ArgumentList "/v:$server"
Start-Sleep -Seconds 5
}
В результате скрипт будет подключаться к серверу и создавать профили пользователей.
5. Копирование данных пользователей
Скопируем только необходимые пользовательские данные (без полного профиля):
- Desktop (Рабочий стол)
- Documents (Документы)
- Downloads (Загрузки)
Это безопаснее: меньше мусора и нет проблем с SID.
Запускаем скрипт на старом сервере. У нового сервера должен быть доступ к сетевой папке temp.
$source = "C:\Users"
$dest = "\\192.168.1.10\temp"
$exclude = @(
"Public",
"Default",
"Default User",
"All Users",
"Administrator"
)
Get-ChildItem $source -Directory | Where-Object {
$exclude -notcontains $_.Name
} | ForEach-Object {
$user = $_.Name
robocopy "$source\$user\Desktop" "$dest\$user\Desktop" /E /COPY:DAT /R:1 /W:1
robocopy "$source\$user\Documents" "$dest\$user\Documents" /E /COPY:DAT /R:1 /W:1
robocopy "$source\$user\Downloads" "$dest\$user\Downloads" /E /COPY:DAT /R:1 /W:1
}
Важные моменты
Профиль должен существовать
Перед копированием пользователь должен хотя бы один раз зайти в систему,
чтобы создалась папка C:\Users\username.
Поэтому данные копируются во временную папку temp, а затем переносятся в профиль.
Локализация папок
На русской системе папки могут отображаться как «Рабочий стол», «Документы», «Загрузки»,
но их реальные имена в файловой системе обычно остаются:
Desktop, Documents, Downloads.