Nâng cấp Domain Controller Windows Server 2008 lên 2025 (qua trung gian 2019)
Lab nâng cấp một forest Active Directory đang chạy Windows Server 2008 SP2 32 bit lên Windows Server 2025 64 bit, kèm migrate toàn bộ role hạ tầng (DNS, DHCP, ADCS, Print Server). Vì WS 2025 yêu cầu Forest Functional Level ≥ 2016 nên không lên thẳng từ FFL 2008 được — lab đi qua một DC trung gian WS 2019 để nâng FFL trước. Flow gồm 9 bước:
- Chuẩn bị
win2008làm DC gốc + sinh dữ liệu test (OU, user, DNS zone, DHCP, ADCS). - Backup toàn diện trên
win2008(System State, ADCS, DHCP, Printer, FSMO). - Dựng
win2019làm DC trung gian (join + promote). - Migrate toàn bộ role (FSMO, DNS, DHCP, ADCS, Print)
win2008→win2019. - Soak vài hôm rồi demote
win2008. - Nâng DFL/FFL lên Windows Server 2016 (lúc này forest chỉ còn
win2019). - Cài
win2025, join domain, promote lên DC (adprep tự chạy, nâng schema). - Migrate role
win2019→win2025, soak rồi demotewin2019, nâng DFL/FFL lên Windows Server 2025. - Kiểm tra cuối.

Mục lục
- Mục tiêu
- Môi trường
- Chuẩn bị
- Tại sao cần DC trung gian 2019?
- Các bước thực hiện
- PHẦN 1 – Chuẩn bị VM1: win2008
- PHẦN 2 – Backup toàn diện trên win2008
- PHẦN 3 – Cài win2019 làm DC trung gian
- PHẦN 4 – Migrate toàn bộ role 2008 → 2019
- PHẦN 5 – Soak rồi demote win2008
- PHẦN 6 – Nâng DFL/FFL lên Windows Server 2016
- PHẦN 7 – Cài và promote win2025
- PHẦN 8 – Migrate role sang win2025, demote win2019 và nâng FFL 2025
- Kiểm tra kết quả
- Kết luận
Mục tiêu
- Hiểu lộ trình nâng cấp DC nhiều bậc khi chênh lệch functional level quá lớn.
- Thực hành backup/restore ADCS, DHCP, Print Server giữa các DC.
- Migrate FSMO an toàn và dọn metadata DC cũ.
Môi trường
3 VM trên VMware ESXi, cùng spec, cùng VLAN 200.
| VM | Tên máy | OS | IP | vCPU | RAM | Disk C | Disk D |
|---|---|---|---|---|---|---|---|
| VM1 | win2008 | WS 2008 SP2 x86 (32-bit) | 10.10.200.41 | 8 | 8GB | 200GB | 500GB |
| VM2 | win2019 | WS 2019 STD x64 (64-bit) | 10.10.200.42 | 8 | 8GB | 200GB | 500GB |
| VM3 | win2025 | WS 2025 STD x64 (24H2) | 10.10.200.43 | 8 | 8GB | 200GB | 500GB |
| Thành phần | Thông số |
|---|---|
| Domain | anhlx.lab |
| Network | VLAN 200 — 10.10.200.0/24, gateway 10.10.200.1 |
| DNS forwarder | 8.8.8.8 |
| CA | ANHLX-CA (Enterprise Root CA) |
| Backup target | ổ D: (500GB) |
Lý do cần DC trung gian win2019: WS 2025 yêu cầu Forest Functional Level ≥ Windows Server 2016. FFL gốc là 2008 → promote WS 2025 thẳng sẽ báo lỗi
The forest functional level must be Windows Server 2016 or higher. Phải nâng FFL quawin2019trước.
Chuẩn bị
- 3 VM đã cài OS, đặt đúng tên máy và IP như bảng trên.
- ISO Windows Server 2008 SP2 32-bit, 2019 Eval x64, 2025 Eval x64.
- Mỗi VM có ổ
D:500GB để chứa backup và file migrate. - Toàn bộ password trong bài (DSRM, local admin, CA backup, user) dùng
Zxcasd123!@#cho lab. ⚠️ Môi trường production phải đổi sang mật khẩu mạnh riêng từng dịch vụ.
Tại sao cần DC trung gian 2019?
Lộ trình “lên thẳng 2025” không khả thi từ FFL 2008.
- WS 2025 yêu cầu Forest Functional Level ≥ Windows Server 2016.
- FFL hiện tại là Windows Server 2008 → promote WS 2025 DC thẳng sẽ fail.
- Thêm 1 DC trung gian (
win2019) để gỡ đượcwin2008mà domain vẫn còn DC, sau đó mới nâng FFL lên 2016 (FFL 2016 yêu cầu mọi DC ≥ Windows Server 2016). - Lộ trình thực tế: thêm
win2019→ migrate toàn bộ role sangwin2019→ soak → demotewin2008→ nâng FFL 2016 → thêmwin2025→ migrate role sangwin2025→ demotewin2019→ nâng FFL 2025.

Các bước thực hiện
PHẦN 1 – Chuẩn bị VM1: win2008
Nếu đã có sẵn VM win2008 từ lab khác, dùng lại — bỏ qua phần này.
1.1. Cài WS2008 SP2 32-bit và đặt tên win2008
IP: 10.10.200.41
Subnet: 255.255.255.0
Gateway: 10.10.200.1
DNS: 127.0.0.1
1.2. Promote lên DC – tạo domain anhlx.lab
dcpromo

- Create new domain in new forest
- FQDN:
anhlx.lab - Forest/Domain Functional Level: Windows Server 2008
- Tích DNS Server
- DSRM password:
Zxcasd123!@#



Cấu hình DNS Forwarder → 8.8.8.8 (sau khi reboot và login lại):

dnscmd /resetforwarders 8.8.8.8
:: Kiểm tra
dnscmd /info /forwarders
nslookup google.com
Bước này bắt buộc trước khi cài DNS zones phụ và các role khác, đảm bảo win2008 resolve được internet.

1.3. Tạo dữ liệu test mô phỏng môi trường
:: ===== OUs =====
dsadd ou "OU=Sample,DC=anhlx,DC=lab"
dsadd ou "OU=Computers,OU=Sample,DC=anhlx,DC=lab"
dsadd ou "OU=Groups,OU=Sample,DC=anhlx,DC=lab"
dsadd ou "OU=Users,OU=Sample,DC=anhlx,DC=lab"
:: Phòng ban mẫu dưới Users
dsadd ou "OU=IT,OU=Users,OU=Sample,DC=anhlx,DC=lab"
dsadd ou "OU=Finance,OU=Users,OU=Sample,DC=anhlx,DC=lab"
dsadd ou "OU=Sales,OU=Users,OU=Sample,DC=anhlx,DC=lab"
:: ===== Groups (Global Security) trong OU=Groups =====
dsadd group "CN=IT,OU=Groups,OU=Sample,DC=anhlx,DC=lab" -secgrp yes -scope g
dsadd group "CN=Finance,OU=Groups,OU=Sample,DC=anhlx,DC=lab" -secgrp yes -scope g
dsadd group "CN=Sales,OU=Groups,OU=Sample,DC=anhlx,DC=lab" -secgrp yes -scope g
:: ===== Users mẫu (1-2 user/phòng để test) =====
set GRP=OU=Groups,OU=Sample,DC=anhlx,DC=lab
dsadd user "CN=Sample User01,OU=IT,OU=Users,OU=Sample,DC=anhlx,DC=lab" -samid user01 -fn "Sample" -ln "User01" -display "Sample User01" -pwd Zxcasd123!@# -disabled no -mustchpwd no
dsmod group "CN=IT,%GRP%" -addmbr "CN=Sample User01,OU=IT,OU=Users,OU=Sample,DC=anhlx,DC=lab"
dsadd user "CN=Sample User02,OU=Finance,OU=Users,OU=Sample,DC=anhlx,DC=lab" -samid user02 -fn "Sample" -ln "User02" -display "Sample User02" -pwd Zxcasd123!@# -disabled no -mustchpwd no
dsmod group "CN=Finance,%GRP%" -addmbr "CN=Sample User02,OU=Finance,OU=Users,OU=Sample,DC=anhlx,DC=lab"
dsadd user "CN=Sample User03,OU=Sales,OU=Users,OU=Sample,DC=anhlx,DC=lab" -samid user03 -fn "Sample" -ln "User03" -display "Sample User03" -pwd Zxcasd123!@# -disabled no -mustchpwd no
dsmod group "CN=Sales,%GRP%" -addmbr "CN=Sample User03,OU=Sales,OU=Users,OU=Sample,DC=anhlx,DC=lab"

1.4. Cài DNS zones phụ
Tạo nhiều zone để minh hoạ migrate DNS đa zone về sau.
⚠️ Bắt buộc dùng
/dsprimary(AD-integrated), KHÔNG dùng/primary. Zone tạo bằng/primarylà standard primary — lưu file trên chínhwin2008, không replicate qua AD → khiwin2008bị gỡ thì zone biến mất. Chỉ zone AD-integrated (/dsprimary) mới nằm trong partitionDomainDnsZones/ForestDnsZonesvà tự theo sangwin2019/win2025.
:: Forward Lookup Zones (8 zones mẫu) — AD-integrated
dnscmd /zoneadd sample1.local /dsprimary
dnscmd /zoneadd sample2.local /dsprimary
dnscmd /zoneadd sample3.local /dsprimary
dnscmd /zoneadd sample4.local /dsprimary
dnscmd /zoneadd sample5.local /dsprimary
dnscmd /zoneadd sample6.local /dsprimary
dnscmd /zoneadd sample7.local /dsprimary
dnscmd /zoneadd sample8.local /dsprimary
:: Reverse Lookup Zones (4 zones) — AD-integrated
dnscmd /zoneadd 0.16.172.in-addr.arpa /dsprimary
dnscmd /zoneadd 1.16.172.in-addr.arpa /dsprimary
dnscmd /zoneadd 3.16.172.in-addr.arpa /dsprimary
dnscmd /zoneadd 30.168.192.in-addr.arpa /dsprimary
Nếu lỡ tạo bằng
/primaryrồi, chuyển sang AD-integrated bằng:dnscmd /zoneresettype <zone> /dsprimary(chạy trên DC còn giữ zone, trước khi demote nó).

1.5. Cài DHCP – 2 scopes
:: Server Manager → Add Roles → DHCP Server
:: Tạo scope 172.16.1.100–200 và 172.16.3.100–200




1.6. Cài ADCS – ANHLX-CA
:: Server Manager → Add Roles → Active Directory Certificate Services
:: CA Type: Enterprise Root CA
:: CA Name: ANHLX-CA
1.7. Kiểm tra và chụp Snapshot
Mục đích: xác nhận DC healthy trước khi nâng cấp. Có lỗi ở đây → fix trước, không làm tiếp.
dcdiag /test:replications
dcdiag /test:services
netdom query fsmo
Kết quả mong đợi:
dcdiag: các test đều passed.netdom query fsmo: cả 5 roles đều hiệnwin2008.anhlx.lab.

Chụp Snapshot win2008-Clean trong VMware ← rollback về đây nếu nâng cấp lỗi.
PHẦN 2 – Backup toàn diện trên win2008
Thực hiện trước khi đụng vào bất cứ thứ gì.
:: Tạo thư mục backup tập trung trên ổ D:
mkdir D:\backup_DC
2.1. Backup System State
wbadminyêu cầu Windows Server Backup feature được cài trước.
:: Bước 1 – Cài Windows Server Backup feature (nếu chưa có)
ServerManagerCmd -install Backup-Features
:: Bước 2 – Backup System State ra D: (wbadmin không hỗ trợ subfolder)
wbadmin start systemstatebackup -backuptarget:D: -quiet
Backup System State lưu tự động vào
D:\WindowsImageBackup\.

2.2. Backup ADCS (ANHLX-CA) – quan trọng nhất
certutil -backupyêu cầu certsvc đang chạy để backup database qua RPC. Không dừng service trước.
:: Đảm bảo certsvc đang chạy
net start certsvc
:: Backup CA key (.p12) + database (live backup)
certutil -backup -p "Zxcasd123!@#" D:\backup_DC\CABackup
:: Backup registry CA config
reg export HKLM\SYSTEM\CurrentControlSet\Services\CertSvc D:\backup_DC\CABackup\CertSvc_Registry.reg
Kiểm tra: dir D:\backup_DC\CABackup — phải thấy thư mục DataBase và file ANHLX-CA.p12.

2.3. Backup DHCP
netsh dhcp server export D:\backup_DC\dhcp_export.xml all
2.4. Backup Printers
printbrm.exekhông nằm trong PATH — phải dùng full path. Cần role Print and Document Services trước.
:: Bước 1 – Cài Print Server role (nếu chưa cài)
ServerManagerCmd -install Print-Services
:: Bước 2 – Backup (dùng full path)
%windir%\system32\spool\tools\printbrm.exe -B -F D:\backup_DC\PrinterBackup.printerExport
Kết quả: Successfully finished operation → file PrinterBackup.printerExport trong D:\backup_DC\.
2.5. Ghi lại FSMO roles
netdom query fsmo > D:\backup_DC\fsmo_before.txt
type D:\backup_DC\fsmo_before.txt

PHẦN 3 – Cài win2019 làm DC trung gian
3.1. Cài WS2019 và đặt tên win2019
- Tạo VM2 → mount ISO WS2019 Eval x64.
- Cài Windows Server 2019 Standard (Desktop Experience).
- Đổi tên:
win2019. - Cấu hình IP:
IP: 10.10.200.42
Subnet: 255.255.255.0
Gateway: 10.10.200.1
DNS: 10.10.200.41 ← trỏ về win2008
3.2. Test kết nối và join domain
ping 10.10.200.41
nslookup anhlx.lab 10.10.200.41
Add-Computer -DomainName "anhlx.lab" -Credential (Get-Credential) -Restart

3.3. Promote win2019 lên DC
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Import-Module ADDSDeployment
Install-ADDSDomainController `
-DomainName "anhlx.lab" `
-InstallDns:$true `
-CreateDnsDelegation:$false `
-DatabasePath "C:\Windows\NTDS" `
-LogPath "C:\Windows\NTDS" `
-SysvolPath "C:\Windows\SYSVOL" `
-NoGlobalCatalog:$false `
-SafeModeAdministratorPassword (ConvertTo-SecureString "Zxcasd123!@#" -AsPlainText -Force) `
-Force:$true


PHẦN 4 – Migrate toàn bộ role 2008 → 2019
Chiến lược không-downtime: dồn tất cả role sống (FSMO, DNS, DHCP, ADCS, Print) sang
win2019trong khiwin2008vẫn chạy. Sau khi services chạy ổn trênwin2019(qua giai đoạn soak ở PHẦN 5), mới demotewin2008. Mỗi lần đổi máy chỉ là cutover ngắn vài phút, không có khoảng trống dài như khi để role về tậnwin2025.
4.1. Chuyển toàn bộ FSMO sang win2019
# Trên win2019 — kiểm tra hiện trạng (cả 5 role đang ở win2008)
netdom query fsmo
# Chuyển 5 role sang win2019
Move-ADDirectoryServerOperationMasterRole -Identity "win2019" `
-OperationMasterRole PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMaster
# Xác nhận — tất cả phải hiện win2019.anhlx.lab
netdom query fsmo

4.2. Trỏ DNS của win2019 về chính nó
win2019 đang trỏ DNS về win2008; chuẩn bị gỡ win2008 nên đổi về chính nó:
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses "127.0.0.1"
Cấu hình DNS forwarder cho win2019 (forwarder là per-server, không replicate giữa các DC nên phải set lại — win2008 sắp tắt):
# Trỏ forwarder ra 8.8.8.8
Set-DnsServerForwarder -IPAddress 8.8.8.8
# Kiểm tra
Get-DnsServerForwarder
nslookup google.com

4.3. Đưa file backup từ win2008 sang win2019
DHCP/ADCS/Print sẽ được restore lên win2019 từ backup đã tạo ở PHẦN 2. Copy thư mục backup sang win2019 (cả hai máy đang chạy):
Trên win2008 — share thư mục backup:
net share backup_DC=D:\backup_DC /grant:Everyone,READ
Trên win2019 — kéo file về:
robocopy \\win2008\backup_DC D:\backup_DC /E

Xác nhận đủ file (CABackup\, dhcp_export.xml, PrinterBackup.printerExport) rồi gỡ share:
:: Trên win2008
net share backup_DC /delete
4.4. Migrate DHCP → win2019
Trên win2019:
Install-WindowsFeature DHCP -IncludeManagementTools
# Authorize win2019
Add-DhcpServerInDC -DnsName "win2019.anhlx.lab" -IPAddress 10.10.200.42
# Import scope từ backup
netsh dhcp server import D:\backup_DC\dhcp_export.xml all
# Trỏ option DNS của scope về win2019
Set-DhcpServerv4OptionValue -ScopeId 172.16.1.0 -OptionId 6 -Value 10.10.200.42
Set-DhcpServerv4OptionValue -ScopeId 172.16.3.0 -OptionId 6 -Value 10.10.200.42
Get-DhcpServerv4Scope

Trên win2008 — gỡ authorization & dừng DHCP cũ:
:: Gỡ authorization DHCP khỏi AD
netsh dhcp delete server win2008.anhlx.lab 10.10.200.41
:: Dừng & disable service
net stop DHCPServer
sc config DHCPServer start= disabled

4.5. Migrate ADCS (ANHLX-CA) → win2019
Cutover CA: CA = 1 danh tính (cùng key + tên), không chạy đồng thời 2 máy được. Quy trình: gỡ CA trên
win2008→ restore lênwin2019(hai bước liền nhau, gap vài phút). Cert đã cấp + CRL trong AD vẫn validate xuyên suốt nên không gián đoạn dịch vụ. Việc gỡ CA ở đây đồng thời thỏa điều kiện demotewin2008ở PHẦN 5 — Enterprise CA phụ thuộc AD DS, còn CA thìdcpromosẽ báo lỗi.
Trên win2008 — gỡ role CA (đã backup ở PHẦN 2.2):
ServerManagerCmd -remove ADCS-Cert-Authority
Hoặc GUI: Server Manager → Roles → Remove Roles → bỏ tích Active Directory Certificate Services.
Trên win2019 — restore CA cùng tên ANHLX-CA:
Thứ tự đúng: cấu hình CA dùng lại key cũ từ file
.p12trước (-CertFile), rồi mới restore database.certutil -restorechỉ chạy được khi CA đã cấu hình — gọi nó trướcInstall-AdcsCertificationAuthoritysẽ lỗi “The system cannot find the file specified”.
# 1. Cài role (binaries)
Install-WindowsFeature ADCS-Cert-Authority -IncludeManagementTools
# 2. Cấu hình CA, nạp lại key + cert cũ từ .p12 (giữ nguyên danh tính ANHLX-CA)
$pw = ConvertTo-SecureString "Zxcasd123!@#" -AsPlainText -Force
Install-AdcsCertificationAuthority `
-CAType EnterpriseRootCA `
-CertFile "D:\backup_DC\CABackup\ANHLX-CA.p12" `
-CertFilePassword $pw `
-OverwriteExistingKey `
-Force
# 3. Khôi phục registry config (CDP/AIA, validity, template settings...)
reg import D:\backup_DC\CABackup\CertSvc_Registry.reg
# 4. Restore database (CA đã cấu hình nên restoredb mới chạy được)
Stop-Service certsvc
certutil -f -restoredb "D:\backup_DC\CABackup"
Start-Service certsvc
Kiểm tra sau restore:
# CA sống — output của -ping in luôn tên CA (ANHLX-CA) và thời gian phản hồi
certutil -ping
# Xem CDP (lưu ý dưới)
Get-CACrlDistributionPoint
# Lịch sử cert đã cấp có restore không (Disposition=20 = Issued)
certutil -view -restrict "Disposition=20" -out "RequestID,CommonName" | more
# Publish lại CRL để chắc chắn CA ký được
certutil -CRL

Mở thêm certsrv.msc (thấy ANHLX-CA Running) và pkiview.msc (Enterprise PKI — tất cả phải xanh).
0 Rowsở bước xem lịch sử là bình thường nếu CA chưa từng cấp cert cho client nào (CA lab mới tạo) — database vẫn được restore đúng (-restoredbbáo 100%). Khi có cert đã cấp thì các request sẽ hiện ở đây.
Lưu ý CDP/AIA: mặc định Enterprise CA dùng URL dạng biến (
http://<ServerDNSName>/...,ldap:///...) nên tự trỏ về server đang chạy CA — không hardcode tên máy cũ. Nếu môi trường production có cấu hình CDP/AIA cố định theo tênwin2008thì sau khi tắt máy đó client không tải được CRL/AIA; sửa bằngGet-CACrlDistributionPoint/Get-CAAuthorityInformationAccess→ trỏ lại DC mới →certutil -CRL.
pkiview báo Unable To Download ở các location HTTP
Sau khi restore, pkiview.msc thường hiện CA màu đỏ (Error) với 3 location HTTP báo Unable To Download:
AIA #2 http://win2019.anhlx.lab/CertEnroll/...crt Unable To Download
CDP #2 http://win2019.anhlx.lab/CertEnroll/ANHLX-CA.crl Unable To Download
DeltaCRL #2 http://win2019.anhlx.lab/CertEnroll/ANHLX-CA+.crl Unable To Download

Các location LDAP và CA Certificate đều OK → CA hoàn toàn khỏe, chỉ là DC mới chưa có IIS virtual directory /CertEnroll để phục vụ file qua HTTP. Cách production chuẩn: tạo vdir CertEnroll trỏ tới thư mục CA publish file — không cần AD CS Web Enrollment (trang /certsrv legacy, và Install-AdcsWebEnrollment hay lỗi 0x80070057 trên Server mới).
# Cài IIS web role nếu chưa có
Install-WindowsFeature Web-WebServer,Web-Mgmt-Console -IncludeManagementTools
Import-Module WebAdministration
# vdir CertEnroll → nơi CA ghi .crt/.crl
New-WebVirtualDirectory -Site "Default Web Site" -Name CertEnroll `
-PhysicalPath "$env:windir\System32\CertSrv\CertEnroll"
# BẮT BUỘC: cho phép double escaping — delta CRL có dấu '+' trong tên (ANHLX-CA+.crl),
# IIS mặc định chặn => DeltaCRL HTTP sẽ 404 nếu không bật
Set-WebConfigurationProperty -PSPath "IIS:\Sites\Default Web Site\CertEnroll" `
-Filter "system.webServer/security/requestFiltering" -Name allowDoubleEscaping -Value $true
certutil -CRL
iisreset
Test: http://win2019.anhlx.lab/CertEnroll/ANHLX-CA.crl tải được. Refresh pkiview.msc (F5) → các location HTTP chuyển OK, CA xanh hết.
Điểm production hay quên khi migrate CA: vdir HTTP
CertEnrollnằm ở IIS của từng DC chạy CA, không replicate theo AD — mỗi lần CA sang máy mới đều phải dựng lại vdir này (kèm bậtallowDoubleEscaping).

4.6. Migrate Print Server → win2019
Trên win2019:
Install-WindowsFeature Print-Server -IncludeManagementTools
# printbrm.exe không nằm trong PATH — gọi full path
& "$env:windir\System32\spool\tools\printbrm.exe" -R -F D:\backup_DC\PrinterBackup.printerExport

Đến đây toàn bộ role (FSMO, DNS, DHCP, ADCS, Print) đã chạy trên win2019.
PHẦN 5 – Soak rồi demote win2008
Toàn bộ role đã nằm trên win2019. Trước khi gỡ hẳn win2008, tắt nó và chạy một mình win2019 vài hôm để chắc chắn không sót dịch vụ/cấu hình nào còn trỏ về win2008.
5.1. Power off win2008 và soak (burn-in) vài hôm
# Trên win2008
Stop-Computer
Trong thời gian soak, kiểm tra trên win2019 (và client):
dcdiagkhông FAIL;netdom query fsmo— cả 5 role =win2019.anhlx.lab.- DNS resolve nội bộ + internet, client nhận IP từ DHCP,
certutil -pingOK, in thử qua print server. - Theo dõi Event Log vài hôm xem có lỗi tham chiếu
win2008không.
Vì sao soak an toàn: đây là power off/on bình thường, KHÔNG phải revert snapshot → nếu cần, bật
win2008lại nó sẽ replicate inbound từwin2019như thường, không gây USN rollback. Chỉ cần đừng đểwin2008off lâu hơn tombstone lifetime (mặc định 60/180 ngày) — quá hạn đó thì không được bật lại mà phải metadata cleanup.

5.2. Demote win2008 (sau khi soak ổn)
⚠️
win2008đã sạch CA (gỡ ở 4.5) và không còn FSMO nêndcpromokhông báo lỗi AD CS nữa. Đảm bảo snapshotwin2008-Cleancòn nguyên (xem Fallback bên dưới).
Bật win2008 lên rồi demote:
:: Trên win2008
dcpromo



Bỏ chọn vai trò Domain Controller. Nếu wizard lỗi không gỡ được, dùng dcpromo /forceremoval. Nhập password local admin, restart → win2008 thành member server.
Xóa metadata (trên win2019):
Demote kiểu wizard (clean) đã tự dọn metadata. Chạy lệnh sau cho chắc; thường nó cũng xong luôn:
Get-ADDomainController -Filter {Name -eq "win2008"} | Remove-ADObject -Recursive -Confirm:$false
# Kiểm tra — chỉ còn win2019
Get-ADDomainController -Filter * | Select-Object Name, OperatingSystem

Sau đó power off win2008 vĩnh viễn (xóa VM sau khi hoàn tất).
🔁 Fallback / Rollback
Snapshot
win2008-Clean(PHẦN 1.7) là bản gốc của forest — chụp trước khi cówin2019/win2025, FSMO còn nguyên trênwin2008. Nếu sau khi demote mà phát hiện sự cố nghiêm trọng không khắc phục được, rollback về hiện trạng ban đầu:
- Power off
win2019(vàwin2025nếu đã có) — tuyệt đối không để chúng chạy/replicate vớiwin2008sau khi restore.- Restore
win2008về snapshotwin2008-Cleanrồi power on.win2008trở lại DC duy nhất, giữ đủ 5 FSMO, không biết gì vềwin2019/win2025.- Verify:
dcdiagkhông FAIL,netdom query fsmocả 5 role =win2008.anhlx.lab.- Xóa hẳn (hoặc dựng lại từ đầu) VM
win2019+win2025. ⚠️ KHÔNG bật lại để join vàowin2008đã restore — sẽ gây USN rollback / lingering objects làm hỏng replication.Lưu ý phân biệt: rollback này dùng revert snapshot (mới gây USN rollback) — khác với power off/on khi soak ở 5.1.
PHẦN 6 – Nâng DFL/FFL lên Windows Server 2016
Giờ forest chỉ còn
win2019(Server 2019 ≥ 2016) và đang giữ toàn bộ FSMO nên nâng được. Đây là điều kiện để promotewin2025.
# Trên win2019
Get-ADForest | Select-Object ForestMode
Get-ADDomain | Select-Object DomainMode
# Nâng Domain + Forest Functional Level lên 2016
Set-ADDomainMode -Identity "anhlx.lab" -DomainMode Windows2016Domain
Set-ADForestMode -Identity "anhlx.lab" -ForestMode Windows2016Forest
# Xác nhận
Get-ADDomain | Select-Object DomainMode
Get-ADForest | Select-Object ForestMode

Kết quả mong đợi: Windows2016Domain / Windows2016Forest → win2025 mới promote được.
Vì FSMO đã nằm trên
win2019vàwin2008đã rời forest, lệnh không còn báoA referral was returned from the server.
PHẦN 7 – Cài và promote win2025
7.1. Cài WS2025 và đặt tên win2025
- Tạo VM3 → mount ISO WS2025 Eval x64.
- Cài Windows Server 2025 Standard (Desktop Experience) — bản 24H2, build 26100.
- Đổi tên:
win2025. - Cấu hình IP:
IP: 10.10.200.43
Subnet: 255.255.255.0
Gateway: 10.10.200.1
DNS: 10.10.200.42 ← trỏ về win2019 (win2008 đã gỡ)
7.2. Test kết nối trước khi join
ping 10.10.200.42
nslookup anhlx.lab 10.10.200.42
nslookup win2025 10.10.200.42
Phải resolve được domain. Nếu không — kiểm tra lại DNS và VMnet.
7.3. Join domain anhlx.lab
Add-Computer -DomainName "anhlx.lab" -Credential (Get-Credential) -Restart

7.4. Cài AD DS role
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
7.5. Promote (adprep chạy tự động)
Import-Module ADDSDeployment
Install-ADDSDomainController `
-DomainName "anhlx.lab" `
-InstallDns:$true `
-CreateDnsDelegation:$false `
-DatabasePath "C:\Windows\NTDS" `
-LogPath "C:\Windows\NTDS" `
-SysvolPath "C:\Windows\SYSVOL" `
-NoGlobalCatalog:$false `
-SafeModeAdministratorPassword (ConvertTo-SecureString "Zxcasd123!@#" -AsPlainText -Force) `
-Force:$true

WS2025 sẽ tự động chạy
adprep /forestprepvàadprep /domainprepđể nâng schema lên 2025 (có thể mất 5–10 phút).
Sau khi reboot, đăng nhập anhlx\administrator.
7.6. Kiểm tra replication
Chờ 10–15 phút sau reboot rồi chạy trên win2025.
a. Tổng quan replication — phải 0 fail:
repadmin /replsummary
Kết quả mong đợi: cột fails/total = 0 / N, cả WIN2019 và WIN2025 đều 0 lỗi.

b. Chi tiết partner — mọi partition “successful”:
repadmin /showrepl
Phải thấy win2025 có INBOUND từ win2019 cho đủ 5 partition (DC=anhlx,DC=lab, Configuration, Schema, ForestDnsZones, DomainDnsZones), mỗi dòng Last attempt @ ... was successful.

c. Test replication:
dcdiag /test:replications

d. DNS zones đã replicate chưa:
Get-DnsServerZone | Select-Object ZoneName, IsADIntegrated, ZoneType
Phải thấy đủ anhlx.lab, _msdcs.anhlx.lab, 8 zone sample*.local + 4 reverse zone, cột IsADIntegrated = True.
Nếu thiếu các zone
sample*→ chúng được tạo dạng/primary(file, không replicate) ở PHẦN 1.4 chứ không phải/dsprimary. Tạo lại dạng AD-integrated trênwin2025:"sample1.local","sample2.local","sample3.local","sample4.local", "sample5.local","sample6.local","sample7.local","sample8.local", "0.16.172.in-addr.arpa","1.16.172.in-addr.arpa","3.16.172.in-addr.arpa","30.168.192.in-addr.arpa" | ForEach-Object { dnscmd /zoneadd $_ /dsprimary }

7.7. Kiểm tra schema đã nâng
Get-ADObject (Get-ADRootDSE).schemaNamingContext -Properties objectVersion |
Select-Object objectVersion
- WS2008 = 44
- WS2025 = 91
Giá trị phải là 91 → schema đã nâng thành công.

PHẦN 8 – Migrate role sang win2025, demote win2019 và nâng FFL 2025
win2025 đã là DC (PHẦN 7). Giờ chuyển nốt role từ win2019 → win2025 rồi gỡ win2019. Quy trình lặp lại như PHẦN 4 nhưng nguồn là win2019, đích là win2025 — lúc này không gấp, làm khi rảnh.
8.1. Chuyển FSMO sang win2025
netdom query fsmo
Move-ADDirectoryServerOperationMasterRole -Identity "win2025" `
-OperationMasterRole PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMaster
netdom query fsmo
Tất cả phải hiện win2025.anhlx.lab.

8.2. DNS — trỏ win2025 về chính nó + forwarder
DNS AD-Integrated zones tự replicate sang win2025 (đã -InstallDns lúc promote). Cấu hình client DNS và forwarder:
# Trên win2025
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses "127.0.0.1", "10.10.200.42"
Set-DnsServerForwarder -IPAddress 8.8.8.8
Get-DnsServerZone | Where-Object {$_.IsADIntegrated -eq $true}
8.3. Migrate DHCP → win2025
Trên win2019 — export :
netsh dhcp server export D:\dhcp_2019.xml all
Copy D:\dhcp_2019.xml sang win2025, rồi trên win2025:
Install-WindowsFeature DHCP -IncludeManagementTools
Add-DhcpServerInDC -DnsName "win2025.anhlx.lab" -IPAddress 10.10.200.43
netsh dhcp server import D:\dhcp_2019.xml all
# Trỏ option DNS của scope về win2025
Set-DhcpServerv4OptionValue -ScopeId 172.16.1.0 -OptionId 6 -Value 10.10.200.43
Set-DhcpServerv4OptionValue -ScopeId 172.16.3.0 -OptionId 6 -Value 10.10.200.43
Get-DhcpServerv4Scope

Trên win2019 — gỡ DHCP cũ:
Remove-DhcpServerInDC -DnsName "win2019.anhlx.lab" -IPAddress 10.10.200.42
Stop-Service DHCPServer
Set-Service DHCPServer -StartupType Disabled
8.4. Migrate ADCS (ANHLX-CA) → win2025
Cutover CA lần 2 (
win2019→win2025), tương tự 4.5. Gỡ CA trênwin2019đồng thời là điều kiện để demotewin2019ở 8.6.
Trên win2019 — backup (key + database + registry) rồi gỡ CA:
certutil -backup -p "Zxcasd123!@#" D:\CABackup_2019
reg export HKLM\SYSTEM\CurrentControlSet\Services\CertSvc D:\CABackup_2019\CertSvc_Registry.reg
# Gỡ Web Enrollment TRƯỚC (đã cài ở 4.5) — nếu không, gỡ CA sẽ báo
# "must uninstall Web enrollment role services before uninstalling the CA"
Uninstall-WindowsFeature ADCS-Web-Enrollment
Uninstall-WindowsFeature ADCS-Cert-Authority
Copy D:\CABackup_2019 sang win2025, rồi trên win2025 (thứ tự như 4.5: cấu hình bằng key cũ trước, restore database sau):
Install-WindowsFeature ADCS-Cert-Authority -IncludeManagementTools
$pw = ConvertTo-SecureString "Zxcasd123!@#" -AsPlainText -Force
Install-AdcsCertificationAuthority `
-CAType EnterpriseRootCA `
-CertFile "D:\CABackup_2019\ANHLX-CA.p12" `
-CertFilePassword $pw `
-OverwriteExistingKey `
-Force
reg import D:\CABackup_2019\CertSvc_Registry.reg
Stop-Service certsvc
certutil -f -restoredb "D:\CABackup_2019"
Start-Service certsvc
# win2025 là DC cuối — dựng lại vdir HTTP CertEnroll cho CDP/AIA (như mục 4.5)
Install-WindowsFeature Web-WebServer,Web-Mgmt-Console -IncludeManagementTools
Import-Module WebAdministration
New-WebVirtualDirectory -Site "Default Web Site" -Name CertEnroll `
-PhysicalPath "$env:windir\System32\CertSrv\CertEnroll"
Set-WebConfigurationProperty -PSPath "IIS:\Sites\Default Web Site\CertEnroll" `
-Filter "system.webServer/security/requestFiltering" -Name allowDoubleEscaping -Value $true
certutil -CRL
iisreset
Kiểm tra: certutil -ping thành công, certsrv.msc thấy ANHLX-CA Running, pkiview.msc (F5) tất cả location xanh (gồm cả HTTP nhờ vdir CertEnroll).

8.5. Migrate Print Server → win2025
Trên win2019 — export tươi (printbrm.exe gọi full path):
& "$env:windir\System32\spool\tools\printbrm.exe" -B -F D:\Printers_2019.printerExport
Copy sang win2025, rồi trên win2025:
Install-WindowsFeature Print-Server -IncludeManagementTools
& "$env:windir\System32\spool\tools\printbrm.exe" -R -F D:\Printers_2019.printerExport

8.6. Soak rồi demote win2019
Toàn bộ role đã sang win2025. Trước khi gỡ hẳn win2019, tắt nó chạy mình win2025 vài hôm để chắc chắn không sót gì còn trỏ về win2019 — giống cách soak win2008 ở PHẦN 5.
Soak: trên win2019 chạy Stop-Computer, rồi trong vài hôm kiểm tra trên win2025 (và client):
dcdiagkhông FAIL;netdom query fsmocả 5 role =win2025.anhlx.lab.- DNS resolve nội bộ + internet, client nhận IP từ DHCP,
certutil -pingOK, in thử qua print server. - Event Log không có lỗi tham chiếu
win2019.
Như PHẦN 5: đây là power off/on bình thường (không revert snapshot) → cần thì bật
win2019lại nó replicate bình thường từwin2025, không USN rollback. Đừng để off lâu hơn tombstone lifetime.
Demote (sau khi soak ổn):
⚠️ Chụp Snapshot
win2019trước bước này. CA đã gỡ ở 8.4 nên demote không lỗi. Trang Remove DNS Delegation xuất hiện thì bỏ chọn (forest root, không có zone cha).
Bật win2019 lên rồi:
Uninstall-ADDSDomainController `
-LocalAdministratorPassword (ConvertTo-SecureString "Zxcasd123!@#" -AsPlainText -Force) `
-LastDomainControllerInDomain:$false `
-RemoveDnsDelegation:$false `
-Force:$true

Máy tự restart → win2019 thành member server. Xóa metadata (trên win2025):
Get-ADDomainController -Filter {Name -eq "win2019"} | Remove-ADObject -Recursive -Confirm:$false
Get-ADDomainController -Filter * | Select-Object Name, OperatingSystem

8.7. Nâng DFL/FFL lên Windows Server 2025
Giờ DC duy nhất là
win2025nên nâng được lên mức 2025.
Set-ADDomainMode -Identity "anhlx.lab" -DomainMode Windows2025Domain
Set-ADForestMode -Identity "anhlx.lab" -ForestMode Windows2025Forest
Get-ADDomain | Select-Object Name, DomainMode
Get-ADForest | Select-Object Name, ForestMode

Kiểm tra kết quả
dcdiagchạy bộ test mặc định (nhanh). Cần kiểm tra sâu thì dùngdcdiag /c(comprehensive) — chậm hơn nhiều vì có test DNS/CutoffServers; muốn nhanh thì bỏ qua test DNS:dcdiag /c /skip:DNS.
# Health check tổng thể
dcdiag
repadmin /replsummary
# FSMO
netdom query fsmo
# DFL / FFL
Get-ADDomain | Select-Object DomainMode
Get-ADForest | Select-Object ForestMode
# Schema version (phải = 91)
Get-ADObject (Get-ADRootDSE).schemaNamingContext -Properties objectVersion | Select-Object objectVersion
# DHCP
Get-DhcpServerv4Scope
Get-DhcpServerInDC
# DNS
Get-DnsServerZone | Select-Object ZoneName, IsADIntegrated
# ADCS (phải: -ping command completed successfully)
certutil -ping
# Test user login
runas /user:anhlx\user01 cmd

Bảng kết quả mong đợi
| Kiểm tra | Kết quả mong đợi |
|---|---|
| DomainMode | Windows2025Domain |
| ForestMode | Windows2025Forest |
| Schema objectVersion | 91 |
| FSMO (cả 5) | win2025.anhlx.lab |
| DHCP scopes | 172.16.1.0 + 172.16.3.0 active |
| DNS zones | Đủ 8 forward + 4 reverse |
| ADCS | ANHLX-CA Running trên win2025 |
| dcdiag | Không có FAIL |
| User login | Thành công với user01 |
Kết luận
Forest đã nâng từ Windows Server 2008 lên 2025 qua DC trung gian 2019, giữ nguyên domain anhlx.lab cùng toàn bộ DNS zone, DHCP scope, ADCS (ANHLX-CA) và FSMO. Hai điểm mấu chốt: (1) dồn hết role sống sang win2019 trước, soak vài hôm rồi mới demote win2008 — mỗi lần đổi máy chỉ là cutover ngắn, không có khoảng trống dài; (2) FFL 2016 yêu cầu mọi DC ≥ Windows Server 2016 nên win2008 (và FSMO của nó) phải rời forest trước khi nâng FFL — đảo thứ tự sẽ dính lỗi A referral was returned from the server. Cutover CA luôn có gap vài phút (CA không chạy 2 máy cùng lúc), nhưng cert đã cấp + CRL trong AD vẫn validate xuyên suốt. Backup đầy đủ trước mọi thao tác, soak là bài test fallback sống, và rollback bằng snapshot win2008-Clean luôn sẵn sàng nếu cần.