Миграция RDS фермы Windows Server 2012 на Windows Server 2016

Миграция RDS фермы Windows Server 2012 на Windows Server 2016

миграция

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов России Pyatilistnik.org. В прошлый раз мы с вами Рассматривали интеграцию драйверов в Windows 7 через usb 3.0 creator utility. Время идет вперед, операционные системы улучшаются и всегда встает задача перехода на более свежее ПО. В сегодняшней публикации мы с вами разберем, как производится мигрирование Remote Desktop Services High Availability на базе Windows Server 2012 R2 на Windows Server 2016-2019. Я покажу какие есть варианты перехода, которые будут зависеть от ваших размеров организации.

Постановка задачи

Есть доменная инфраструктура Active Directory, в ней существует отказоустойчивая RDS ферма на базе Windows Server 2012 R2, в компании было принято решение, о переходе в качестве корпоративного стандарта ОС на Windows Server 2016. Сама RDS ферма состоит из 50 RDSH хостов и обслуживает свыше 4000 пользователей. Хочется максимально безболезненно перевести пользователей на новую RDS. Ниже я покажу несколько вариантов миграции.

Варианты миграции RDS фермы

Существует как минимум два варианта, которые вам позволят произвести переход вашей старой RDS фермы на новую. Тут все будет зависеть от ваших свободных ресурсов. Будет ряд шагов общих для обоих вариантов. Вначале вы разворачиваете отказоустойчивую Remote Desktop Services High Availability на базе Windows Server 2016. Вам нужно получить как минимум два хоста RDCB и один хост RDSH, как это делается смотрите по ссылке. Далее два варианта:

  • Вы уведомляете пользователей, что будут произведены работы по модернизации RDS фермы. Переводите все узлы подключения в режим стока. После чего вы удаляете один из RDSH хостов из коллекции в текущей RDS ферме, через оснастку управления.

Миграция RDS

После чего вы данный хост добавляете в новую RDS ферму на базе WindowsServer 2016. Проделываем так со всеми RDSH хостами. Когда все хосты подключений будут управляться новыми брокерами и будут уже частью новой коллекции. Вам остается только произвести переключение DNS записи на новый RDS HA пул. Потом вы спокойно будите добавлять по одному новому хосту с Windows Server 2016, меняя его на старые с Windows Server 2012. Через какое-то время вы все так замените.

Не забываем про свои групповые политики которые были на старой RDS ферме. Вам нужно все будет перенести, чтобы пользователи ничего не увидели

На этом обновление RDS фермы Windows Server 2012 на Windows Server 2016 можно почти считать готовым, за исключением того, если у вас используются перемещаемые профили пользователей. Я не зря завел разговор про перемещаемые профили, так как у них немного другой формат в новой ОС. На RDS Windows Server 2012 R2 профиль имеет формат username.domain.V2, а вот уже у Windows Server 2016 формат username.domain.V6. Все отличие в цифре. Так, что если вы хотите, чтобы пользователи увидели свои данные при следующем подключении, вам необходимо переименовать старые профили на новый манер. Если у вас их мало, то можно сделать и вручную, но если как у меня, это тысячи пользователей, то тут нужно скриптовать.

Миграция RDS фермы Windows Server 2012 на Windows Server 2016

Скрипт переименовывания профилей V2 на V6

Ниже скрипт PowerShell, он имеет два варианта, либо переименовать все профили в нужном каталоге, либо переименовать только те, что подсовываются в текстовом файле.

function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}

$folder_to_process = "M:\Share\TS" # "Путь до папки с перемещаемыми профилями"
$userlist_file = "C:\Temp\user.txt" # "Путь до файла со списком пользователей"

# 1. По возможности все папки у которых в имени .V2 на конце, переименовать в .V6
$process_full_folder = $false # Если стоит false, то массового переименовывания не будет, использовать при точечном варианте
# 2. Подсунуть список из файла с именами логинов, и только их папки если там .V2 переименовать в .V6
$process_from_file = $true # Ставим false, если нужно массово переименовать все профили в определенном каталоге

if ($process_full_folder)
{
"$(Date) Processing whole folder $folder_to_process"

foreach ($folder in (Get-ChildItem $folder_to_process -Directory | ? {$_.Name -like "*.V2"}))
{
$newname = $folder.Name -replace ".V2", ".V6"
"$(Date) Renaming folder $($folder.Name) to $newname"

try {
Rename-Item -Path $folder.FullName -NewName $newname -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" #| Tee-Object $log -Append
}
}
}

###

if ($process_from_file)
{
"$(Date) Processing folders from file $userlist_file"

foreach ($username in (Get-Content $userlist_file))
{
$folders = $null
$folders = Get-ChildItem $folder_to_process | ? {$_.Name -like "$username.*.V2"}

if ($folders)
{
foreach ($folder in $folders)
{
$newname = $folder.Name -replace ".V2", ".V6"
"$(Date) Renaming folder $($folder.Name) to $newname"

try {
Rename-Item -Path $folder.FullName -NewName $newname -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" #| Tee-Object $log -Append
}
}
}
else
{
"$(Date) Unable to find suitable folder for username `"$username`""
}
}
}

Скрипт переименовывания профилей V6 на V2

function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}

$folder_to_process = "M:\Share\TS" # "Путь до папки с перемещаемыми профилями"
$userlist_file = "C:\Temp\user.txt" # "Путь до файла со списком пользователей"

# 1. По возможности все папки у которых в имени .V6 на конце, переименовать в .V2
$process_full_folder = $false
# 2. Подсунуть список из файла с именами логинов, и только их папки если там .V6 переименовать в .V2
$process_from_file = $true

if ($process_full_folder)
{
"$(Date) Processing whole folder $folder_to_process"

foreach ($folder in (Get-ChildItem $folder_to_process -Directory | ? {$_.Name -like "*.V6"}))
{
$newname = $folder.Name -replace ".V6", ".V2"
"$(Date) Renaming folder $($folder.Name) to $newname"

try {
Rename-Item -Path $folder.FullName -NewName $newname -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" #| Tee-Object $log -Append
}
}
}

###

if ($process_from_file)
{
"$(Date) Processing folders from file $userlist_file"

foreach ($username in (Get-Content $userlist_file))
{
$folders = $null
$folders = Get-ChildItem $folder_to_process | ? {$_.Name -like "$username.*.V6"}

if ($folders)
{
foreach ($folder in $folders)
{
$newname = $folder.Name -replace ".V6", ".V2"
"$(Date) Renaming folder $($folder.Name) to $newname"

try {
Rename-Item -Path $folder.FullName -NewName $newname -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" #| Tee-Object $log -Append
}
}
}
else
{
"$(Date) Unable to find suitable folder for username `"$username`""
}
}
}

Ну и план отката, если нужно вернуть все профили в исходное состояние.

  • Второй вариант миграции RDS фермы Windows Server 2012 на Windows Server 2016 заключается в том, что вы параллельно создаете с новым именем RDS ферму с небольшим количеством хостов, настраиваете там все групповые политики и нормативы вашей компании. Далее я вам советую произвести выгрузку пользователей, чтобы понять когда последний раз у них изменялся перемещаемый профиль, делается, это для того, чтобы исключить лишние профили, которые не нужно переносить. Далее начинаете процесс миграции и переименовывание профилей. По мере увеличения количества пользователей на новой RDS ферме вы будите тушить старые хосты и ресурсы освободившиеся от них добавлять новым RDSH хостам в новой ферме. Через какое-то время вы все спокойно перевезете, в конце сможете еще так же переключить старое DNS имя на новое, чтобы те кто по ошибке будут ошибочно подключаться, попадали так же на новый терминал. Данный метод хорош тем, что у вас при наличии ресурсов, останется старая ферма на случай проблем с новой.

Так же советую посмотреть документацию Microsoft - https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/migrate-rds-role-services

На этом у меня все, мы с вами разобрали варианты обновления RDS фермы Windows Server 2012 на Windows Server 2016. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *