Контроллер домена на Server 2012: миграция AD для холдинга с 400 пользователями

Задача клиента: домен на устаревшей ОС без поддержки

В начале 2026 года к нам обратился производственный холдинг ПромСтройГрупп из Самары — группа из четырёх заводов, объединённых общей IT-инфраструктурой. В инфраструктуре работало 400 доменных пользователей, 35 серверов и 12 групповых политик (GPO).

Проблема: два контроллера домена (DC) работали на Windows Server 2012 R2, расширенная поддержка которого закончилась в октябре 2023 года. Более двух лет серверы не получали обновлений безопасности.

«Мы понимаем, что это риск, но боимся трогать. Последний раз, когда мы обновляли контроллер домена 5 лет назад, два отдела не могли войти в систему сутки» — IT-директор ПромСтройГрупп.

Аудит, проведённый инженерами АйТи Фреш, выявил следующие проблемы:

  • Уровень леса и домена — Windows Server 2012 R2 (нет поддержки современных фич AD)
  • CVE без патчей — минимум 12 критических уязвимостей AD за 2024–2025, включая Zerologon-подобные
  • SYSVOL на FRS — устаревшая репликация File Replication Service вместо DFS-R
  • Нет второго сайта AD — оба DC в одной серверной, нет disaster recovery
  • Устаревшие GPO — 4 из 12 политик не применялись, 2 конфликтовали

План миграции

Мы разработали план миграции, который гарантировал нулевой простой для пользователей:

  • Этап 1: Аудит здоровья AD (dcdiag, repadmin, DNS)
  • Этап 2: Развёртывание двух новых DC на Windows Server 2022
  • Этап 3: Репликация и проверка синхронизации
  • Этап 4: Перенос FSMO-ролей на новые DC
  • Этап 5: Миграция DNS и DHCP
  • Этап 6: Миграция SYSVOL с FRS на DFS-R
  • Этап 7: Аудит и очистка GPO
  • Этап 8: Вывод старых DC из эксплуатации
  • Этап 9: Повышение уровня леса и домена до 2016

Аудит здоровья Active Directory

Перед любой миграцией необходимо убедиться, что AD находится в рабочем состоянии. Мы запустили серию диагностик на обоих старых DC:

# Полная диагностика контроллера домена
dcdiag /v /c /d /e /s:DC01-OLD

# Ключевые тесты:
# Starting test: Advertising         ... passed
# Starting test: FrsEvent            ... passed
# Starting test: DFSREvent           ... warning (FRS to DFS-R migration not started)
# Starting test: SysVolCheck         ... passed
# Starting test: KccEvent            ... passed
# Starting test: KnowsOfRoleHolders  ... passed
# Starting test: MachineAccount      ... passed
# Starting test: NCSecDesc           ... passed
# Starting test: NetLogons           ... passed
# Starting test: ObjectsReplicated   ... passed
# Starting test: Replications        ... passed
# Starting test: RidManager          ... passed
# Starting test: Services            ... passed
# Starting test: VerifyReferences    ... passed

# Проверка репликации
repadmin /replsummary
# Source DSA     largest delta    fails/total %%  error
# DC01-OLD       0:05:12          0 /  5    0
# DC02-OLD       0:05:14          0 /  5    0

# Проверка FSMO-ролей
netdom query fsmo
# Schema master              DC01-OLD.promstroy.local
# Domain naming master       DC01-OLD.promstroy.local
# PDC                        DC01-OLD.promstroy.local
# RID pool manager           DC01-OLD.promstroy.local
# Infrastructure master      DC02-OLD.promstroy.local

# Проверка DNS
dcdiag /test:DNS /v /e
# DNS delegation test       ... passed
# DNS dynamic update test   ... passed
# DNS record registration   ... passed

Аудит показал, что AD здоров, репликация работает, но SYSVOL использует устаревший FRS вместо DFS-R — это нужно будет исправить.

Развёртывание новых контроллеров домена

Мы подготовили два новых сервера с Windows Server 2022 Standard. Серверы были размещены в разных серверных комнатах для отказоустойчивости.

Установка Windows Server 2022 и подготовка

На обоих новых серверах (DC01-NEW и DC02-NEW) выполнили базовую настройку:

# PowerShell — базовая настройка нового сервера

# Переименование
Rename-Computer -NewName "DC01-NEW" -Restart

# Статический IP
New-NetIPAddress -InterfaceAlias "Ethernet" `
  -IPAddress 10.0.1.10 `
  -PrefixLength 24 `
  -DefaultGateway 10.0.1.1

# DNS — указываем на существующие DC
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" `
  -ServerAddresses @("10.0.1.1", "10.0.1.2")  # DC01-OLD, DC02-OLD

# Присоединение к домену
Add-Computer -DomainName "promstroy.local" `
  -Credential (Get-Credential) `
  -Restart

# Обновления Windows
Install-WindowsUpdate -AcceptAll -AutoReboot

Промоут серверов до контроллеров домена

Добавляем новые серверы как контроллеры домена в существующий лес:

# На DC01-NEW: установка роли AD DS
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools

# Промоут до контроллера домена (дополнительный DC в существующий домен)
Import-Module ADDSDeployment

Install-ADDSDomainController `
  -DomainName "promstroy.local" `
  -SiteName "Default-First-Site-Name" `
  -DatabasePath "D:\NTDS" `
  -LogPath "D:\NTDS" `
  -SysvolPath "D:\SYSVOL" `
  -InstallDns:$true `
  -ReplicationSourceDC "DC01-OLD.promstroy.local" `
  -Credential (Get-Credential) `
  -SafeModeAdministratorPassword (ConvertTo-SecureString "S4feM0de!P@ss" -AsPlainText -Force) `
  -NoRebootOnCompletion:$false `
  -Force:$true

# Сервер перезагрузится автоматически
# Повторяем процедуру на DC02-NEW

После перезагрузки проверяем, что новые DC вошли в репликацию:

# Проверка репликации на новом DC
repadmin /replsummary
# Source DSA     largest delta    fails/total %%  error
# DC01-OLD       0:03:22          0 / 10    0
# DC02-OLD       0:03:24          0 / 10    0
# DC01-NEW       0:01:15          0 / 10    0
# DC02-NEW       0:01:18          0 / 10    0

# Проверка синхронизации объектов
repadmin /replsummary /bysrc /bydest /sort:delta

# Проверка DNS-записей нового DC
nslookup DC01-NEW.promstroy.local
# Name:    DC01-NEW.promstroy.local
# Address: 10.0.1.10

# Полная диагностика нового DC
dcdiag /v /c /s:DC01-NEW
# ... all tests passed

Перенос FSMO-ролей

FSMO (Flexible Single Master Operations) — это 5 уникальных ролей в Active Directory, которые может выполнять только один контроллер домена. Их перенос — самый ответственный этап миграции.

Перенос всех пяти FSMO-ролей

Мы перенесли роли поэтапно, проверяя работоспособность после каждого переноса:

# Перенос FSMO-ролей с DC01-OLD на DC01-NEW
# Выполняется на DC01-NEW

# 1. PDC Emulator (самая критичная — аутентификация, GPO, время)
Move-ADDirectoryServerOperationMasterRole `
  -Identity "DC01-NEW" `
  -OperationMasterRole PDCEmulator `
  -Confirm:$false

# Проверка
Get-ADDomainController -Filter * | Where-Object {$_.OperationMasterRoles -contains "PDCEmulator"} | Select-Object Name
# Name: DC01-NEW  ✓

# 2. RID Master (выдача RID-пулов для создания объектов)
Move-ADDirectoryServerOperationMasterRole `
  -Identity "DC01-NEW" `
  -OperationMasterRole RIDMaster `
  -Confirm:$false

# 3. Infrastructure Master
Move-ADDirectoryServerOperationMasterRole `
  -Identity "DC01-NEW" `
  -OperationMasterRole InfrastructureMaster `
  -Confirm:$false

# 4. Schema Master (уровень леса)
Move-ADDirectoryServerOperationMasterRole `
  -Identity "DC01-NEW" `
  -OperationMasterRole SchemaMaster `
  -Confirm:$false

# 5. Domain Naming Master (уровень леса)
Move-ADDirectoryServerOperationMasterRole `
  -Identity "DC01-NEW" `
  -OperationMasterRole DomainNamingMaster `
  -Confirm:$false

# Финальная проверка всех ролей
netdom query fsmo
# Schema master              DC01-NEW.promstroy.local
# Domain naming master       DC01-NEW.promstroy.local
# PDC                        DC01-NEW.promstroy.local
# RID pool manager           DC01-NEW.promstroy.local
# Infrastructure master      DC01-NEW.promstroy.local

Перенастройка DNS на клиентских машинах

После переноса FSMO необходимо, чтобы все клиенты использовали новые DC для DNS:

# Обновляем DNS-серверы через DHCP
# На DHCP-сервере меняем DNS-серверы для scope
Set-DhcpServerv4OptionValue -ScopeId 10.0.1.0 `
  -DnsServer @("10.0.1.10", "10.0.1.11") `
  -DnsDomain "promstroy.local"

# Для серверов со статическими IP — через GPO или скрипт
$servers = @("SRV-FILE", "SRV-PRINT", "SRV-APP1", "SRV-SQL")
foreach ($server in $servers) {
    Invoke-Command -ComputerName $server -ScriptBlock {
        Set-DnsClientServerAddress -InterfaceAlias "Ethernet" `
          -ServerAddresses @("10.0.1.10", "10.0.1.11")
    }
    Write-Host "DNS обновлён на $server"
}

# Обновляем Forwarders на новых DC
Set-DnsServerForwarder -IPAddress @("8.8.8.8", "77.88.8.8") `
  -ComputerName "DC01-NEW"
Set-DnsServerForwarder -IPAddress @("8.8.8.8", "77.88.8.8") `
  -ComputerName "DC02-NEW"

# Проверяем, что DNS-зоны реплицированы
Get-DnsServerZone -ComputerName DC01-NEW | Format-Table ZoneName, ZoneType, IsReverseLookupZone
# ZoneName                    ZoneType  IsReverseLookupZone
# promstroy.local             Primary   False
# 1.0.10.in-addr.arpa         Primary   True
# _msdcs.promstroy.local      Primary   False

Миграция SYSVOL с FRS на DFS-R

SYSVOL — общая папка, которая хранит групповые политики и скрипты входа. На старых DC она реплицировалась через устаревший FRS (File Replication Service). Windows Server 2022 не поддерживает FRS, поэтому миграция на DFS-R обязательна.

Четыре этапа миграции FRS → DFS-R

Миграция SYSVOL проходит через 4 состояния. Каждый переход необратим:

# Проверяем текущее состояние миграции
dfsrmig /getglobalstate
# Current Global State: 'Start'
# Succeeded.

# Этап 1: Prepared — DFS-R создаёт копию SYSVOL, FRS продолжает работать
dfsrmig /setglobalstate 1
# Current Global State: 'Prepared'
# Succeeded.

# Ждём завершения репликации на ВСЕХ DC
dfsrmig /getmigrationstate
# All Domain Controllers have migrated successfully to Global state ('Prepared').
# Migration has reached a consistent state on all Domain Controllers.
# Succeeded.

# Этап 2: Redirected — клиенты переключаются на DFS-R копию SYSVOL
dfsrmig /setglobalstate 2
# Current Global State: 'Redirected'
# Succeeded.

# Проверяем, что SYSVOL доступен через DFS-R
net share | findstr SYSVOL
# SYSVOL       D:\SYSVOL\sysvol

# Этап 3: Eliminated — FRS полностью удаляется
dfsrmig /setglobalstate 3
# Current Global State: 'Eliminated'
# Succeeded.

# Финальная проверка
dfsrmig /getmigrationstate
# All Domain Controllers have migrated successfully to Global state ('Eliminated').
# Migration has reached a consistent state on all Domain Controllers.
# Succeeded.

# Проверяем репликацию SYSVOL через DFS-R
Get-DfsReplicationGroup -GroupName "Domain System Volume"
# GroupName            : Domain System Volume
# DomainName           : promstroy.local
# State                : Normal

Проверка GPO после миграции SYSVOL

После миграции SYSVOL критически важно проверить, что все групповые политики работают:

# Список всех GPO
Get-GPO -All | Format-Table DisplayName, GpoStatus, CreationTime, ModificationTime
# DisplayName                  GpoStatus    CreationTime         ModificationTime
# Default Domain Policy        AllEnabled   01.03.2018 10:30     15.06.2025 14:22
# Default Domain Controllers   AllEnabled   01.03.2018 10:30     20.08.2025 09:15
# Workstation Security         AllEnabled   15.05.2019 11:00     10.01.2026 16:45
# Office Apps Settings         AllEnabled   20.09.2020 14:30     05.12.2025 11:30
# Password Policy              AllEnabled   01.03.2018 10:31     22.07.2024 08:00
# Screen Lock Policy           AllEnabled   10.04.2021 09:00     10.04.2021 09:00
# Disabled Printer GPO         AllDisabled  12.11.2019 16:00     12.11.2019 16:00
# ...

# Проверяем GPO на ошибки
Get-GPO -All | ForEach-Object {
    $report = Get-GPOReport -Guid $_.Id -ReportType XML
    $xml = [xml]$report
    $links = $xml.GPO.LinksTo.SOMPath
    if (-not $links) {
        Write-Host "ВНИМАНИЕ: GPO '$($_.DisplayName)' не привязана ни к одному OU" -ForegroundColor Yellow
    }
}
# ВНИМАНИЕ: GPO 'Disabled Printer GPO' не привязана ни к одному OU
# ВНИМАНИЕ: GPO 'Test WiFi Policy' не привязана ни к одному OU
# ВНИМАНИЕ: GPO 'Old VPN Settings (2020)' не привязана ни к одному OU
# ВНИМАНИЕ: GPO 'Temp Deploy Script' не привязана ни к одному OU

# Принудительное обновление GPO на тестовой машине
gpupdate /force /target:computer
gpresult /r

Аудит выявил 4 «мёртвые» политики, которые никуда не привязаны и не применяются. Мы создали бэкап и удалили их после согласования с IT-директором.

Вывод старых контроллеров домена из эксплуатации

Самый опасный этап — демонтаж старых DC. Ошибка здесь может привести к потере аутентификации для всех 400 пользователей.

Понижение DC01-OLD и DC02-OLD

Мы выполняли понижение поочерёдно, с перерывом в один рабочий день для проверки:

# На 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 в будущем (если потребуется).

Аудит и оптимизация групповых политик

Параллельно с миграцией DC мы провели полный аудит групповых политик, которые накопились за 8 лет.

Инвентаризация и очистка GPO

# Полный отчёт по всем GPO с привязками
Get-GPO -All | ForEach-Object {
    $gpo = $_
    $report = Get-GPOReport -Guid $gpo.Id -ReportType XML
    $xml = [xml]$report
    $links = ($xml.GPO.LinksTo | ForEach-Object { $_.SOMPath }) -join "; "
    $userSettings = $xml.GPO.User.ExtensionData.Count
    $compSettings = $xml.GPO.Computer.ExtensionData.Count

    [PSCustomObject]@{
        Name            = $gpo.DisplayName
        Status          = $gpo.GpoStatus
        Created         = $gpo.CreationTime.ToString("dd.MM.yyyy")
        Modified        = $gpo.ModificationTime.ToString("dd.MM.yyyy")
        UserSettings    = $userSettings
        CompSettings    = $compSettings
        Links           = if ($links) { $links } else { "НЕТ ПРИВЯЗКИ" }
    }
} | Format-Table -AutoSize

# Бэкап всех GPO перед очисткой
$backupPath = "D:\GPO-Backup-$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Path $backupPath
Get-GPO -All | ForEach-Object {
    Backup-GPO -Guid $_.Id -Path $backupPath
    Write-Host "Backed up: $($_.DisplayName)"
}

# Удаление неиспользуемых GPO (после согласования с клиентом)
$unusedGPOs = @("Disabled Printer GPO", "Test WiFi Policy", "Old VPN Settings (2020)", "Temp Deploy Script")
foreach ($name in $unusedGPOs) {
    Remove-GPO -Name $name -Confirm:$false
    Write-Host "Удалена: $name"
}

Усиление парольной политики

Старая парольная политика не соответствовала современным стандартам. Мы обновили её:

# Текущая политика
Get-ADDefaultDomainPasswordPolicy
# ComplexityEnabled        : True
# LockoutDuration          : 00:30:00
# LockoutObservationWindow : 00:30:00
# LockoutThreshold         : 5
# MaxPasswordAge           : 90.00:00:00
# MinPasswordAge           : 1.00:00:00
# MinPasswordLength        : 8
# PasswordHistoryCount     : 12

# Обновляем — увеличиваем минимальную длину до 12
Set-ADDefaultDomainPasswordPolicy -Identity "promstroy.local" `
  -MinPasswordLength 12 `
  -LockoutThreshold 5 `
  -LockoutDuration "00:15:00" `
  -LockoutObservationWindow "00:15:00" `
  -MaxPasswordAge "180.00:00:00" `
  -PasswordHistoryCount 24

# Fine-Grained Password Policy для администраторов
New-ADFineGrainedPasswordPolicy -Name "Admin-Password-Policy" `
  -Precedence 10 `
  -MinPasswordLength 16 `
  -ComplexityEnabled $true `
  -MaxPasswordAge "90.00:00:00" `
  -LockoutThreshold 3 `
  -LockoutDuration "01:00:00"

# Применяем к группе администраторов
Add-ADFineGrainedPasswordPolicySubject `
  -Identity "Admin-Password-Policy" `
  -Subjects "Domain Admins", "Enterprise Admins"

Результаты внедрения

Миграция заняла 2 недели, из которых 3 дня — аудит, 3 дня — развёртывание новых DC, 3 дня — перенос ролей и DNS, и 5 дней — тестирование и вывод старых DC. Простой для пользователей: 0 минут.

МетрикаДо миграцииПосле миграции
ОС контроллеров доменаWindows Server 2012 R2 (EOL)Windows Server 2022
Неустранённые CVE12+ критических0 (актуальные обновления)
Репликация SYSVOLFRS (устаревший)DFS-R (современный)
Функциональный уровень доменаWindows Server 2012 R2Windows Server 2016
Количество GPO12 (4 неиспользуемые)8 (актуальные, документированные)
Георезервирование DCНет (оба DC в одной комнате)Да (2 серверные комнаты)
Простой при миграции0 минут
«Мы два года откладывали миграцию, боясь сломать домен. Инженеры АйТи Фреш провели всё настолько гладко, что пользователи даже не поняли, что что-то изменилось. А мы наконец-то спим спокойно, зная что контроллеры на поддерживаемой ОС» — IT-директор ПромСтройГрупп.

Часто задаваемые вопросы

Да, прямая миграция поддерживается. Windows Server 2022 может быть добавлен как контроллер домена в лес уровня Windows Server 2012 R2. Важно: перед промоутом нового DC необходимо выполнить adprep /forestprep и adprep /domainprep для обновления схемы леса. В Windows Server 2022 эти команды выполняются автоматически при промоуте, если у вас есть права Enterprise Admin.

FSMO (Flexible Single Master Operations) — 5 ролей, которые может выполнять только один DC в домене/лесе: Schema Master, Domain Naming Master, PDC Emulator, RID Master, Infrastructure Master. Они не переносятся автоматически, потому что отвечают за критические операции (изменение схемы, выдача RID, аутентификация Kerberos). Принудительный захват (seize) используется только если старый DC навсегда недоступен. При плановой миграции всегда используйте штатный перенос через Move-ADDirectoryServerOperationMasterRole.

Неограниченно. Active Directory поддерживает DC на разных версиях Windows Server в одном лесу. Мы рекомендуем параллельную работу минимум 1–2 недели перед выводом старых DC. За это время убедитесь, что: репликация работает без ошибок (repadmin /replsummary), все клиенты используют новые DC для DNS, групповые политики применяются корректно (gpresult /r на тестовых машинах).

Если Uninstall-ADDSDomainController завершается ошибкой, сначала проверьте: 1) На DC не осталось FSMO-ролей (netdom query fsmo); 2) Репликация с другими DC работает (repadmin /showrepl); 3) Нет объектов, привязанных именно к этому DC. Если штатное понижение невозможно (например, DC повреждён), используйте принудительное удаление метаданных: ntdsutil → metadata cleanup. После этого вручную очистите DNS-записи и объекты в AD Sites and Services.

Нет, миграция DC не влияет на пароли пользователей. Хеши паролей реплицируются между DC автоматически. Однако мы рекомендуем использовать миграцию как повод для усиления парольной политики — увеличить минимальную длину, включить Fine-Grained Password Policy для администраторов и провести аудит учётных записей с нарушениями политики.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#миграция Active Directory#FSMO роли перенос#dcdiag Windows Server#контроллер домена миграция#Windows Server 2012 EOL#AD DS обновление#SYSVOL DFS-R миграция#GPO аудит