Самый опасный этап — демонтаж старых DC. Ошибка здесь может привести к потере аутентификации для всех 400 пользователей.
Мы выполняли понижение поочерёдно, с перерывом в один рабочий день для проверки:
# На DC02-OLD (сначала тот, где меньше ролей):
# 1. Проверяем, что на нём нет FSMO-ролей
netdom query fsmo
# Все роли на DC01-NEW — OK
# 2. Убеждаемся, что DNS-ссылки на этот DC удалены
# (все клиенты уже используют новые DC для DNS)
# 3. Понижение DC (demote)
Uninstall-ADDSDomainController `
-DemoteOperationMasterRole:$false `
-RemoveApplicationPartitions `
-LocalAdministratorPassword (ConvertTo-SecureString "L0calAdm!n" -AsPlainText -Force) `
-Force:$true
# Сервер перезагружается как обычный member server
# 4. Проверяем репликацию на оставшихся DC
repadmin /replsummary
# Source DSA largest delta fails/total %% error
# DC01-OLD 0:03:22 0 / 8 0
# DC01-NEW 0:01:15 0 / 8 0
# DC02-NEW 0:01:18 0 / 8 0
# DC02-OLD отсутствует — OK
# 5. Ждём один рабочий день, убеждаемся что всё работает
# 6. Повторяем для DC01-OLD
# На DC01-OLD:
Uninstall-ADDSDomainController `
-DemoteOperationMasterRole:$false `
-RemoveApplicationPartitions `
-LastDomainControllerInDomain:$false `
-LocalAdministratorPassword (ConvertTo-SecureString "L0calAdm!n" -AsPlainText -Force) `
-Force:$true
После удаления старых DC нужно очистить метаданные и поднять функциональный уровень:
# Очистка метаданных старых DC (если остались записи)
Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, IsGlobalCatalog
# Name IPv4Address IsGlobalCatalog
# DC01-NEW 10.0.1.10 True
# DC02-NEW 10.0.1.11 True
# Только 2 DC — OK, старые удалены
# Очистка DNS-записей старых DC
$oldDCs = @("DC01-OLD", "DC02-OLD")
foreach ($dc in $oldDCs) {
Get-DnsServerResourceRecord -ZoneName "promstroy.local" `
-ComputerName "DC01-NEW" | `
Where-Object {$_.HostName -eq $dc} | `
Remove-DnsServerResourceRecord -ZoneName "promstroy.local" `
-ComputerName "DC01-NEW" -Force
Write-Host "DNS-записи $dc удалены"
}
# Удаляем компьютерные объекты старых DC из OU Domain Controllers
Get-ADComputer -Filter {Name -like "DC*-OLD"} -SearchBase "OU=Domain Controllers,DC=promstroy,DC=local" |
Remove-ADComputer -Confirm:$false
# Повышаем уровень домена и леса
Set-ADDomainMode -Identity "promstroy.local" -DomainMode Windows2016Domain -Confirm:$false
Set-ADForestMode -Identity "promstroy.local" -ForestMode Windows2016Forest -Confirm:$false
# Проверяем
Get-ADDomain | Select-Object DomainMode
# DomainMode: Windows2016Domain
Get-ADForest | Select-Object ForestMode
# ForestMode: Windows2016Forest
Мы подняли уровень до Windows Server 2016, а не 2022, чтобы сохранить возможность добавления DC на Server 2016 в будущем (если потребуется).