# Domain Controller Migration Runbook: Add New DCs and Retire Old Ones This is a plain-text copy of a guide published by Ellington Technologies, made for pasting into an AI assistant. It's generated from the same source file as the web page. If the two ever differ, the web page is correct: https://jeremiahellington.com/resources/domain-controller-migration-runbook - Source (authoritative web version): https://jeremiahellington.com/resources/domain-controller-migration-runbook - Author: Jeremiah Ellington - Published: 2026-10-27 - Last updated: 2026-10-27 - Last reviewed: 2026-10-27 - Next scheduled review: 2027-04-30 - Applies to: Adding Windows Server 2022 or 2025 domain controllers to an existing single-domain Active Directory forest, then demoting the older DCs. Commands for Windows PowerShell 5.1 with the ActiveDirectory, ADDSDeployment, DnsServer and DhcpServer modules. Checked against Microsoft Learn on 2026-10-26; not tested on hardware. - Who it's for: Administrators who already run an Active Directory domain and need to replace its domain controllers with new servers, one at a time, without downtime. - Level: Advanced - Before you start: Domain Admins membership, and Enterprise Admins for the forest-wide FSMO roles and the automatic schema update; A current, tested system-state backup of at least two existing DCs; A maintenance window and a written rollback plan for each phase; The new servers' names, static IPv4 addresses and AD site, decided in advance A ten-phase checklist for adding new Windows Server domain controllers to an existing Active Directory domain, moving the FSMO roles, and retiring the old DCs safely. --- This runbook is for replacing the domain controllers in an Active Directory domain you already run. You add new DCs alongside the old ones, prove they're healthy, move the FSMO roles, repoint everything that used the old DCs, and only then demote the old ones. Done in that order, nobody should notice. It doesn't cover building a new forest from nothing, an in-place OS upgrade of an existing DC, read-only DCs, or multi-domain forests. Every name and address below is a made-up example: `corp.example.com` and addresses from the documentation ranges in RFC 5737. Swap in your own before you run anything. > **Warning:** > Every command here was checked against Microsoft's documentation on Microsoft Learn, but none has been run in a lab or on real servers for this page. Try each phase on a test domain first, and read each command before you paste it. Steps marked **Changes production** alter live systems. ## Before you start ### New forest or existing domain? These are different jobs, and mixing their commands is a classic way to break things. | You're doing | Cmdlet | This runbook? | |---|---|---| | Building a brand-new forest (first DC of a new domain) | `Install-ADDSForest` | No. That creates a new, separate directory. | | Adding a DC to a domain that already exists | `Install-ADDSDomainController` | Yes | | Removing a DC that isn't the last one in its domain | `Uninstall-ADDSDomainController` | Yes | > **Caution:** > If you see `Install-ADDSForest` or `-LastDomainControllerInDomain` in a migration script, stop. Neither belongs in a migration where the domain keeps running. ### Example names used on this page | Placeholder | Meaning | Example | |---|---|---| | `corp.example.com` | Your AD DNS domain (also the forest root here) | `corp.example.com` | | `DC=corp,DC=example,DC=com` | The same domain as a distinguished name | | | `` | A DC you're retiring (repeat per DC) | `DC-OLD-01` at `192.0.2.10` | | `` | A new DC you're adding (repeat per DC) | `DC-NEW-01` at `192.0.2.20` | | `` | The AD site the new DC belongs to | `Default-First-Site-Name` | | `` | The subnet's default gateway | `192.0.2.1` | ### How to read the steps - **Where to run it** is in each code block's title. "Elevated" means an administrator Windows PowerShell 5.1 session. Some cmdlets used here (`Add-Computer`, `Test-ComputerSecureChannel`) aren't in PowerShell 7. - Steps tagged **Changes production** in the checklists change directory, DNS, DHCP or server state. Each has a caution above it and, where the cmdlet supports it, a `-WhatIf` or test run first. - Only commands checked against Microsoft's documentation appear in copyable code blocks. Emergency procedures (seizing roles, metadata cleanup) are described in text on purpose: read the linked article before you do either. - Nothing on this page runs anything. Your ticks and notes stay in your browser, and they're only saved if you turn saving on above. ## Phase 1: Health baseline and safety net Record a known-good state before you change anything, and make sure you can get back to it. If the domain isn't healthy now, fix that first: a new DC copies whatever problems the old ones have. > **Important:** > A DC backup is only usable for a limited time, the tombstone lifetime (180 days by default in forests created since Windows Server 2003 SP1). Take fresh system-state backups of at least two DCs, and know how you'd restore one, before Phase 4. *Changes production: On each , elevated: system-state backup to a dedicated volume* ```powershell Install-WindowsFeature Windows-Server-Backup wbadmin start systemstatebackup -backupTarget:E: ``` *On each , elevated: full diagnostics saved to a file* ```powershell New-Item -ItemType Directory -Path C:\Migration -ErrorAction SilentlyContinue dcdiag /v /c /s: /f:C:\Migration\dcdiag__baseline.txt dcdiag /test:DNS /v /s: dcdiag /test:Advertising /test:NetLogons /test:SysVolCheck /test:DFSREvent /s: ``` *From any domain-joined admin host, elevated: replication summary* ```powershell repadmin /replsummary repadmin /showrepl * /csv > C:\Migration\showrepl_baseline.csv repadmin /queue ``` *On the PDC emulator, elevated: SYSVOL replication state* ```powershell dfsrmig /getglobalstate ``` `dfsrmig /getglobalstate` should report the **Eliminated** state, which means SYSVOL already replicates with DFS Replication. Windows Server 2019 and later can't be added as DCs while the domain still uses FRS for SYSVOL. If yours does, migrate first with [Microsoft's SYSVOL migration guide](https://learn.microsoft.com/en-us/windows-server/storage/dfs-replication/migrate-sysvol-to-dfsr), and treat that as its own change: moving to Eliminated can't be undone. *From an admin host with the ActiveDirectory module: inventory and levels* ```powershell Get-ADDomainController -Filter * | Select-Object Name,IPv4Address,Site,OperationMasterRoles Get-ADForest | Select-Object Name,ForestMode Get-ADDomain | Select-Object DNSRoot,DomainMode Get-SmbShare -CimSession -Name SYSVOL,NETLOGON w32tm /monitor ``` Check the functional levels against the new DCs' OS. Per [Microsoft's functional-level table](https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels), a Windows Server 2025 DC needs domain and forest functional levels of at least Windows Server 2016. Earlier releases accept some lower levels, so look up your exact combination in that table. If your levels are too low for the release you want, plan an intermediate step. **Phase 1 checklist** - [ ] System-state backups taken on at least two existing DCs, stored off the DC, and a restore procedure written down - [ ] `dcdiag` baseline saved for every existing DC, and every failure explained or fixed - [ ] `repadmin /replsummary` shows no failures and `repadmin /queue` is empty or draining - [ ] `dfsrmig /getglobalstate` reports Eliminated (SYSVOL on DFSR) - [ ] Forest and domain functional levels recorded and checked against the new DCs' OS - [ ] Current DCs, their sites and their FSMO roles recorded - [ ] `w32tm /monitor` shows the DCs in sync, with the PDC emulator using a reliable time source - [ ] Started the dependency list for Phase 7: anything that points at an old DC by name or IP ## Phase 2: Build and patch the new servers Build each new server with a supported Windows Server release, give it its final name, and patch it fully before it joins the domain. Server Core is a good fit for a DC. *On each , elevated* ```powershell Rename-Computer -NewName -Restart ``` Patch with whatever your organization already uses (WSUS, your update management tool, or Windows Update). On Server Core, `sconfig` option **6** (Install updates) installs quality updates. Repeat until no updates are offered, then reboot. Set the time zone if it isn't right (`Get-TimeZone -ListAvailable` lists the IDs). Don't configure a separate time source on a DC that isn't the PDC emulator: members of the domain follow the domain hierarchy. *On each , elevated* ```powershell Set-TimeZone -Id "