1. 迁移前的准备工作:环境评估与备份策略
在开始迁移前,我们需要对现有环境进行全面评估。我通常会花2-3天时间进行这项准备工作,因为前期准备越充分,迁移过程就越顺利。首先用PowerShell命令Get-ADForest查看当前林功能级别,用Get-ADDomain检查域功能级别。对于从Windows Server 2016迁移到2022的场景,建议先将林和域功能级别提升到Windows Server 2016(如果尚未升级)。
重要提示:务必在非工作时间进行系统状态备份,使用Windows Server Backup或第三方工具如Veeam创建完整的系统状态备份。我曾遇到过因跳过备份步骤导致回退困难的情况。
备份关键数据包括:
- 使用
ntdsutil工具备份Active Directory数据库 - 导出组策略对象(GPO):
Backup-GPO -All -Path C:\GPOBackup - 记录FSMO角色持有者:
netdom query fsmo - 检查DNS区域配置:
Get-DnsServerZone | Select-Object ZoneName, ZoneType
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 新DC服务器的部署与基础配置
在新服务器上安装Windows Server 2022时,建议选择"带GUI的服务器"安装选项。安装完成后,首先执行以下关键步骤:
2.1 网络配置与功能添加
powershell复制# 设置静态IP(示例)
New-NetIPAddress -IPAddress 192.168.1.10 -PrefixLength 24 -DefaultGateway 192.168.1.1 -InterfaceIndex (Get-NetAdapter).ifIndex
# 安装AD域服务角色
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
2.2 提升为域控制器
使用Install-ADDSDomainController命令将新服务器加入现有域。这里有个关键参数-InstallDns需要特别注意:
powershell复制Install-ADDSDomainController `
-DomainName "contoso.com" `
-InstallDns:$true `
-Credential (Get-Credential) `
-DatabasePath "C:\Windows\NTDS" `
-LogPath "C:\Windows\NTDS" `
-SysvolPath "C:\Windows\SYSVOL" `
-NoGlobalCatalog:$false `
-SiteName "Default-First-Site-Name" `
-Force:$true
3. 账户与计算机对象的迁移技术
3.1 使用ADMT工具迁移用户账户
Active Directory迁移工具包(ADMT)是最可靠的迁移工具。我推荐使用最新版本的ADMT(v5.2+),安装时需要注意:
- 在新DC上安装ADMT和SQL Express
- 配置共享文件夹用于存储迁移日志
- 建立源域和目标域之间的信任关系
迁移用户账户的完整命令示例:
powershell复制admt user /n "CN=Users,DC=contoso,DC=com" /t "CN=Users,DC=contoso,DC=com" /to "OU=MigratedUsers,DC=contoso,DC=com" /sdc:dc2016.contoso.com /tdc:dc2022.contoso.com /s:*
3.2 计算机对象的迁移技巧
计算机对象迁移需要特别注意SID历史记录和安全描述符。实际操作中我通常分三个阶段:
- 测试迁移:先迁移少量测试计算机
- 验证阶段:检查组策略应用和网络访问
- 批量迁移:使用脚本批量处理
迁移脚本示例:
powershell复制$computers = Get-ADComputer -Filter * -SearchBase "OU=Workstations,DC=contoso,DC=com"
foreach ($computer in $computers) {
Move-ADObject -Identity $computer.DistinguishedName -TargetPath "OU=MigratedComputers,DC=contoso,DC=com"
}
4. 组策略对象的迁移与验证
4.1 组策略迁移方法对比
我测试过三种主要迁移方法,各有优缺点:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 备份/还原 | 简单直接 | 可能丢失部分设置 | 少量GPO迁移 |
| 迁移表 | 精确控制 | 配置复杂 | 跨域迁移 |
| PowerShell | 可自动化 | 需要脚本能力 | 大批量迁移 |
4.2 使用PowerShell迁移GPO
这是我最推荐的方法,可以精确控制迁移过程:
powershell复制# 从源DC导出GPO
$sourceGPOs = Get-GPO -All -Domain contoso.com -Server dc2016
foreach ($gpo in $sourceGPOs) {
Backup-GPO -Guid $gpo.Id -Path "C:\GPOMigration" -Domain contoso.com -Server dc2016
}
# 导入到目标DC
$backups = Get-ChildItem "C:\GPOMigration" -Directory
foreach ($backup in $backups) {
Import-GPO -BackupId $backup.Name -TargetName $backup.Name -Path "C:\GPOMigration" -CreateIfNeeded -Domain contoso.com -Server dc2022
}
4.3 组策略迁移后的验证
迁移完成后必须进行严格验证,我通常会检查:
- GPO版本号是否匹配
- 安全筛选设置是否正确
- WMI筛选器是否完整
- 组策略首选项是否生效
验证脚本示例:
powershell复制# 比较源和目标GPO数量
$sourceCount = (Get-GPO -All -Domain contoso.com -Server dc2016).Count
$targetCount = (Get-GPO -All -Domain contoso.com -Server dc2022).Count
if ($sourceCount -ne $targetCount) {
Write-Warning "GPO数量不匹配!源:$sourceCount 目标:$targetCount"
}
# 检查关键GPO设置
$importantGPOs = "Default Domain Policy", "Default Domain Controllers Policy"
foreach ($gpoName in $importantGPOs) {
$sourceSettings = Get-GPOReport -Name $gpoName -Domain contoso.com -Server dc2016 -ReportType Xml
$targetSettings = Get-GPOReport -Name $gpoName -Domain contoso.com -Server dc2022 -ReportType Xml
Compare-Object $sourceSettings $targetSettings
}
5. 迁移后的清理与优化工作
5.1 FSMO角色转移
当新DC运行稳定后,需要转移FSMO角色。我建议按以下顺序操作:
- 使用PowerShell转移架构主机和域命名主机:
powershell复制Move-ADDirectoryServerOperationMasterRole -Identity "DC2022" -OperationMasterRole SchemaMaster,DomainNamingMaster
- 转移PDC模拟器、RID主机和基础结构主机:
powershell复制Move-ADDirectoryServerOperationMasterRole -Identity "DC2022" -OperationMasterRole PDCEmulator,RIDMaster,InfrastructureMaster
5.2 降级旧DC服务器
在确认所有功能正常后,可以降级旧DC。关键步骤:
- 检查复制状态:
repadmin /showrepl - 确认没有应用程序依赖旧DC
- 使用
Uninstall-ADDSDomainController进行降级
5.3 DNS和DHCP配置更新
最后需要更新网络配置:
- 将新DC设为首选DNS服务器
- 更新DHCP作用域中的DNS服务器设置
- 检查所有静态配置设备的DNS设置
我通常会运行以下命令检查DNS健康状况:
powershell复制Test-DnsServer -IPAddress 192.168.1.10 -Context DnsServer
Test-DnsServer -IPAddress 192.168.1.10 -Context RootHints
Test-DnsServer -IPAddress 192.168.1.10 -Context Forwarder
6. 常见问题排查与解决方案
在实际迁移过程中,我遇到过各种问题,以下是几个典型场景:
6.1 SID历史记录问题
当用户无法访问资源时,可能是SID历史记录未正确迁移。解决方法:
powershell复制# 检查用户SID历史
Get-ADUser -Identity username -Properties sidhistory
# 如果需要手动添加
Set-ADUser -Identity username -Add @{sidhistory=@('S-1-5-21-...')}
6.2 组策略应用失败
如果组策略未正确应用,可以按以下步骤排查:
- 运行
gpresult /h report.html生成策略报告 - 检查事件查看器中的组策略相关事件
- 使用
gpupdate /force强制刷新策略
6.3 复制延迟问题
我曾遇到新DC上的更改不能及时复制到其他DC的情况,解决方法:
- 检查复制拓扑:
repadmin /replsummary - 手动触发复制:
repadmin /syncall /AdeP - 检查防火墙设置,确保以下端口开放:
- TCP 135 (RPC)
- TCP/UDP 389 (LDAP)
- TCP/UDP 636 (LDAPS)
- TCP 3268/3269 (GC)
7. 性能优化与最佳实践
根据多次迁移经验,我总结出以下优化建议:
7.1 数据库优化
AD数据库性能对迁移至关重要,可以执行:
powershell复制# 检查数据库状态
ntdsutil "activate instance ntds" "files" "info"
# 执行离线碎片整理(需重启到DSRM模式)
ntdsutil "activate instance ntds" "files" "compact to c:\compact" "quit" "quit"
7.2 索引优化
为常用查询属性添加索引:
powershell复制Get-ADObject -SearchBase (Get-ADRootDSE).SchemaNamingContext -Filter {name -like "attribute*"} |
Where-Object {$_.searchFlags -notmatch '1'} |
ForEach-Object {
Set-ADObject -Identity $_ -Add @{searchFlags=1}
}
7.3 监控策略
建立迁移后的监控体系:
- 设置关键性能计数器警报(CPU、内存、磁盘)
- 监控复制延迟:
repadmin /showrepl * /csv - 定期检查AD健康状况:
dcdiag /v /c /d /e
我通常会配置以下性能计数器:
- DS:Directory Searches/sec
- DS:Writes/sec
- NTDS:DRA Pending Replication Operations
- NTDS:DRA Inbound Bytes/sec
8. 安全加固与合规检查
迁移完成后,必须进行安全加固:
8.1 特权账户保护
- 保护特权组(如Domain Admins):
powershell复制Get-ADGroup "Domain Admins" | Set-ADObject -ProtectedFromAccidentalDeletion $true
- 启用特权访问管理(PAM):
powershell复制Install-WindowsFeature -Name Privileged-Access-Management -IncludeManagementTools
8.2 审核策略配置
配置详细的AD变更审核:
powershell复制# 启用详细审核
Set-GPRegistryValue -Name "Default Domain Controllers Policy" -Key "HKLM\System\CurrentControlSet\Control\Lsa" -ValueName "SCENoApplyLegacyAuditPolicy" -Type DWord -Value 1
# 配置审核策略
$auditPolicy = @{
"AuditAccountLogon" = "Success, Failure"
"AuditAccountManagement" = "Success, Failure"
"AuditDirectoryServiceAccess" = "Success, Failure"
}
$auditPolicy.GetEnumerator() | ForEach-Object {
Set-GPRegistryValue -Name "Default Domain Controllers Policy" -Key "HKLM\System\CurrentControlSet\Control\Lsa" -ValueName $_.Key -Type String -Value $_.Value
}
8.3 补丁管理
确保新DC已安装最新补丁:
powershell复制# 检查已安装更新
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10
# 配置自动更新(如有需要)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value 0
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value 4
