凌晨两点接到值班电话,说域内用户全部无法登录,OA、ERP、文件服务器统统弹认证失败。远程一看,主域控制器已经彻底失联,机房那边反馈硬件告警,服务器直接黑屏。那一刻我脑子里的第一个念头并不是“怎么修”,而是——“如果这台主域控制器彻底回不来,我这个Windows Server 2019域的辅域控制器,怎么顶上去?”
这篇文章就把我当时完整走了一遍的方案写出来。整个操作的核心结论是:辅域控制器升级为主域控制器,本质上并不是“升级”,而是“强行夺取”——把原来属于主域控制器的五种FSMO角色抢过来,然后把坏了那台从域里永远除名。整个过程不复杂,但每一步都藏着一个“如果做错了就会很惨”的细节。
1. 主域控“猝死”之后,先别急着动手
很多刚接触AD域的人,遇到主域控宕机的第一反应是:赶紧把辅域控的IP改成主域控的IP,或者把辅域控的DNS地址改一下,让客户端能找到它。这个操作我劝你千万不要做,我下面会详细解释为什么。
1.1 先分清你是“辅域控转正”还是“异地重建”
拿到现场之后,先问自己一个问题:这台坏掉的主域控,是彻底报废,还是有可能修复后重新开机?
这个判断非常重要,因为它直接决定了后续操作的方向。如果主域控是硬件故障(比如主板烧了、硬盘阵列彻底损坏),属于“不可恢复”,那就走**强制夺取(seize)**的路线,也就是这篇文章的方法。如果主域控只是宕机但硬盘数据还在,理论上还能救回来,那还有另一种叫“强制还原(non-authoritative restore)”的复杂恢复路线,但那种情况我不建议普通管理员自行尝试,需要微软支持级别的专业判断。
我当时的场景很明确:机房师傅电话里说电源模块烧毁伴有焦味,主板大概率也挂了。所以我不再考虑恢复旧域控,直接走辅域控转正路线。
1.2 五大FSMO角色现在在谁手里
在动手之前,必须先搞清楚AD域控制器之间的权力结构。
一个域里,有五种角色被称为FSMO(Flexible Single Master Operation),在全域范围内具有“唯一性”:
| 角色名称 | 职责简述 |
|---|---|
| 架构主控(Schema Master) | 负责AD架构扩展,整个林只有一个 |
| 域命名主控(Domain Naming Master) | 管理域林中域的添加和删除 |
| PDC模拟器(PDC Emulator) | 管理时间同步、账户锁定、密码更新等 |
| RID主控(RID Master) | 分配安全标识符池,保证SID唯一 |
| 基础结构主控(Infrastructure Master) | 维护跨域对象引用 |
正常情况下,这五个角色都在主域控制器上。现在主域控挂了,这些角色处于“失联”状态。辅域控要变主域控,必须把这五个角色全部夺到自己身上。
这里要区分两个英文动词:Transfer(转移)和Seize(夺取)。转移是在原主域控还活着、能够正常通信的情况下,把角色优雅地转移过去。而夺取则是在原主域控已经彻底失联的情况下,强行把角色抢过来。角色一旦夺取成功,如果原来的主域控以后意外恢复并重新接入网络,就会发生“脑裂”(split brain),所以后面必须对旧主域控做元数据清理,把它彻底从AD中踢掉。
1.3 最忌讳的一步:直接把旧主域控IP改到辅域控上
我见过不止一个同行,为了图省事,直接把原主域控的IP地址手动配置到辅域控网卡上,以为这样客户端就能自动找到它。这个操作在极小的单域单站点环境里偶尔能糊弄过去,但绝大多数情况下会引发更麻烦的问题。
原因在于:AD域环境中,客户端定位域控靠的是DNS里的SRV记录,而不是直接连通某个固定IP。IP地址改了,但DNS服务器里的SRV记录指向的还是旧的机器名和IP。如果辅域控不是一个Global Catalog(GC)服务器,或者没有在DNS里正确注册自己的SRV记录,你就算把IP硬改成主域控的IP,客户端照样找不到域控。
我当时采取的做法是:不修改任何IP,先让辅域控保持它原有的IP地址和机器名,完成角色夺取之后,再通过正常手段调整DNS里的SRV记录指向。这样做风险最小,出问题也最容易回溯。
2. 动手前的体检:辅域控这个“备胎”到底能不能扛事
虽然标题叫“升级”,但辅域控并不是说转就转的。在夺取角色之前,先花二十分钟给辅域控做一遍体检,能帮你避开后面至少十个隐藏坑。
2.1 时间同步问题,最容易翻车的隐藏坑
AD域对时间同步的要求非常严格。Kerberos认证协议默认允许的最大时间偏差是5分钟。如果你的辅域控时间偏离主域控(或者偏离外部时间源)超过这个阈值,域内所有客户端都会认证失败,而且你根本查不出是什么原因导致的。
正常情况下,域内所有服务器和客户端的时间都应该以PDC模拟器为准。现在PDC模拟器在主域控上,已经失联了。这么一来域内缺少一个权威时间源。定时任务的触发、文件服务器的时间戳、日志的完整性、域控之间的复制都可能出问题。
所以在夺取角色之前,我建议你先手动把辅域控的时间校正到接近真实时间,命令如下:
w32tm /config /manualpeerlist:"ntp.aliyun.com,0x8" /syncfromflags:manual /reliable:yes /update Restart-Service w32time w32tm /resync提示:如果你没有可用的外部NTP服务器,也可以在辅助域控上先用
net time \\主域控IP /set同步一次时间,但主域控已挂的情况下这条路走不通,所以建议直接配一个外部时间源。
我在实际环境中用的就是阿里云的NTP服务器。夺取角色完成之后,还要把这个辅域控设置为权威时间源,让其他域成员服务器继续从它这里同步时间,这个我在后面第三节详细讲。
2.2 dcdiag基本健康检查
辅域控既然要转正,就要保证它自身状态健康。用管理员身份打开CMD,依次执行以下命令:
dcdiag /v dcdiag /test:replications dcdiag /test:dns repadmin /replsummary这几个命令能反映出:
- 辅域控自身的AD数据库是否完整
- 它与主域控之间的复制链路是否正常(在主域控挂掉前,辅域控有没有同步到最新的数据)
- DNS区域是否存在缺失记录
我那次检查发现,辅域控的复制状态处于“上次成功复制是3天前”。原因是我们那位主域控其实已经亚健康了好几天,事件日志里一直报复制错误,但没人关注。好在3天的时间差并没有造成灾难性后果,不过也说明一个问题:**辅域控只有在持续健康同步的前提下,才有“转正”的资格。**如果辅域控与主域控已经失去同步很久,强行夺取角色后可能会导出不一致的数据,这种情况下建议先评估是否要放弃这台辅域控,重新搭建新域控更稳妥。
2.3 备份与还原兜底方案
很多人会忽略这步,觉得主域控都挂了,辅域控是唯一的根,备份它还有什么意义?
其实恰恰因为它是唯一的根,备份才更要紧。操作过程中,如果夺取FSMO角色到一半服务器崩溃,或者元数据清理时误操作删了不该删的东西,这时候你手上没有任何备份,就只能整个域推倒重建。
辅域控的备份和普通文件备份不是一回事。AD数据库的备份需要借助Windows Server Backup功能里的“System State”(系统状态)备份。安装和备份命令如下:
Install-WindowsFeature Windows-Server-Backup wbadmin start systemstatebackup -backupTarget:E:这里有两个重点:
- 系统状态备份必须用本地磁盘以外的目标盘。我一般习惯加一块独立数据盘专门放备份,这样系统盘出问题不至于连带备份一起丢。
- 备份期间不要同时执行角色夺取操作。我当时是凌晨做的,业务压力最小,先把备份跑完,再开始夺角色,整个时间线安排得很从容。
3. 强制夺取FSMO五大角色的完整操作
体检通过、备份完毕之后,就可以正式操作了。我当时用的命令是ntdsutil,这是微软自带的AD管理工具,功能很强大,但交互式命令行的操作方式让不少人望而却步。其实只要一步步照着做,逻辑很清晰。
3.1 ntdsutil夺取角色命令全解析
在辅域控上,以管理员身份打开CMD,输入以下命令:
ntdsutil接着在ntdsutil提示符下逐行输入:
roles connections connect to server 你的辅域控主机名 quit seize PDC seize RID master seize infrastructure master seize schema master seize domain naming master quit quit这里有很多人第一次操作时会犯一个错误:输完seize PDC之后,系统会弹出确认提示,问你是否确定要夺取,此时必须输入yes而不是直接回车。我当时就是因为没看清楚,随手按了个回车,结果这个角色没夺成功,后面检查netdom query fsmo才发现,赶紧重新来了一遍。
整个过程的命令执行顺序是有讲究的。我建议严格按上面这个顺序来:
- 先夺取PDC模拟器,因为它是操作中最关键的角色,直接影响后续的命令执行环境。
- 再夺RID主控,保证后续创建对象时有SID池可用。
- 然后夺取基础结构主控、架构主控、域命名主控。
等到提示“已成功从服务器夺取角色”之类的字样,再用quit退出工具。
执行完成后,用下面命令验证角色归属:
netdom query fsmo正常输出应该显示五种角色全部都在这台辅域控上。翻车的情况是:你会发现某个角色仍然指向已经挂掉的主域控名称。如果出现这种情况,不要慌,重新进ntdsutil,对没夺成功的角色再执行一次seize对应的命令即可。
3.2 角色夺取后的验证与DNS落地
FSMO角色夺完之后,这只是“权力”层面的交接。要让客户端真正以这台辅域控为准,还有几件事要做。
首先检查DNS服务器是否已经注册了必要的SRV记录。在辅域控上执行:
nslookup -type=SRV _ldap._tcp.dc._msdcs.你的域名 nslookup -type=SRV _kerberos._tcp.dc._msdcs.你的域名正常的话,返回结果里应该出现辅域控的主机名。如果SRV记录里还残留旧主域控的记录,而且它已不可达,客户端解析时会浪费时间,甚至解析到不存在的服务器上。我当时是打开DNS管理器,把旧主域控相关记录手动删除,并确保_msdcs区域里的记录都指向辅域控。
还有一点值得注意:如果原主域控同时是DNS服务器,你现在相当于失去了原来的DNS基础设施,辅域控上的DNS服务必须开启并设置为权威。检查DNS服务状态:
Get-Service DNS如果不是running状态,立刻启动。然后把辅域控的网卡DNS指向自己,这样它才能正常解析自己的记录。
3.3 全局编录与PDC时间源的修正
辅域控转正之后,它还必须承担起两个基础职责:全局编录(Global Catalog)和权威时间源。
如果是单域环境,所有域控默认都应启用GC。在“Active Directory 站点和服务”控制台里,展开“Sites→Default-First-Site-Name→Servers→辅域控主机名→NTDS Settings”,右键属性勾选“全局编录”即可。这一步不能漏,否则以后Exchange、Lync这类依赖GC的应用程序会出问题。
然后是时间源修正。因为PDC模拟器现在已经在这台机器上,我需要把它的时间源配置改成“可靠模式”,让域内其他机器都向它看齐:
w32tm /config /syncfromflags:manual /manualpeerlist:"ntp.aliyun.com,0x8" /reliable:yes /update Restart-Service w32time w32tm /resync执行完这个命令,辅域控就成了域内的权威时间服务器。其他成员服务器和客户端会通过域层级自动同步,不需要每台手工设置。这里有个小坑:如果你用了类似time.windows.com的默认NTP服务器,在有些内网隔离环境中根本访问不了,导致时间源起不来,所以我一直建议直接配国内可达的NTP地址。
4. 旧主域控的“善后”——元数据清理不能跳过
角色夺完、服务跑起来,很多人就觉得大功告成了。其实还差最关键的一步:把旧主域控的残留数据从AD数据库里清理掉。
这个过程在微软术语里叫“元数据清理”(Metadata Cleanup)。不做这一步,AD数据库里会一直存在一台状态为“已损坏”或者“以非正常方式关闭”的域控对象,后面会引发很多莫名其妙的问题。
4.1 元数据不清理的后果是什么
我先说说如果跳过这一步会怎样,这样你就明白为什么非做不可了。
假设将来某一天,公司规模扩大,你在域的“Active Directory站点和服务”里面想添加一台新域控。AD会尝试联系旧主域控做复制。因为旧主域控的计算机账户还存在域里,AD复制拓扑依然认为它是一台合法且存在的域控,一旦新域控部署完毕,复制初始化就会反复尝试连接旧主域控,导致新域控一直处于“正在等待复制”的状态,无法完成提权。
另外一个更直接的后果是:你每次用dcdiag /v做全域体检,都会看到一台服务器报“无法连接、无法复制”之类的错误。这种报错虽然不一定马上影响业务,但长期存在会掩盖真正的问题,等哪天早晨再响一次告警,你很难分辨是哪个环节出了问题。
4.2 ntdsutil元数据清理的完整步骤
元数据清理同样通过ntdsutil完成,但操作入口和夺角色不一样。完整命令如下:
ntdsutil metadata cleanup connections connect to server 辅域控主机名 quit select operation target list domains select domain 0 list sites select site 0 list servers in domain select server 旧主域控编号 quit remove selected server quit quit执行过程中,list servers in domain这一步非常关键,它能显示域名内所有域控,编号从0开始。你需要看清哪个编号是旧主域控,然后执行select server 对应编号,再执行remove selected server。
这里有一个我自己踩过的坑:执行remove selected server时一定要在quit之前完成,如果你先输入了quit,就退出当前选择上下文,还得重新select operation target,整套流程重来一遍。我那次折腾到快凌晨四点,脑子已经有点迟钝,结果连续两次都是因为多按了一个quit前功尽弃。后来我养成一个习惯,在操作这类交互式命令前,先把完整的命令序列写在一个文本文件里,一行行照着敲,绝不凭记忆。
4.3 站点服务里残留对象的处理
ntdsutil清理完元数据之后,旧主域控的计算机账户一般会自动消失,但有时候站点容器里还会残留它的服务器对象。
打开“Active Directory 站点和服务”,展开Sites → Default-First-Site-Name → Servers,如果还能看到旧主域控的主机名,右键删除即可。删除时如果系统提示“不能删除,因为复制尚未完成”,别急,返回第一步确认ntdsutil元数据清理是否真正执行成功,然后再刷新控制台。
我遇到的情况是:控制台里旧主域控对象已经消失了,但DNS区域里还残留若干A记录和SRV记录。这些记录如果不清除,客户端在做DNS解析时可能会偶尔解析到旧的IP,产生间歇性登录缓慢。我建议在DNS管理器里按旧主机名搜索所有记录,右键删除,并且把正向查找区域里旧域控的A记录一并删除。
5. 升级完成后的全链路自检
所有角色和元数据都处理完之后,别急着收工。我把整个自检过程分成了三条线:域控自身健康、客户端认证、复制拓扑,每条线都有对应的命令和判断标准。
5.1 dcdiag与repadmin的深度体检
先在辅域控上跑一遍完整的域控体检:
dcdiag /c /v这个命令会检查各种各样的项目,包括DNS、复制、服务状态、RID池、FSMO角色可访问性等。输出内容很长,但重点看结尾的摘要,凡是标了Failed或Warning的项目,都值得深入排查。
我那次跑完之后,发现有一个警告:“There are warning or error events within the last 24 hours after the SCM started.”这是事件日志层面的警告,打开事件查看器定位到Directory Service日志,看到几个复制错误,反复确认都是旧主域控失联期间产生的历史事件,不影响当前运行。所以看到警告不要慌,先判断是历史残留还是实时错误。
然后看复制摘要:
repadmin /replsummary正常情况下结果里不会出现大于一定阈值的复制失败。如果是单域双域控环境,旧主域控已经清理,新拓扑里其实就剩这一台域控,复制义务反而简单了。
5.2 客户端认证与DNS解析验证
域控层面的检查做完,回到客户端视角。随便找一台域内Windows 10/11电脑,在CMD里执行:
echo %LOGONSERVER% whoami /fqdn nltest /dsgetdc:你的域名nltest /dsgetdc这条命令的作用是向域请求一个可用的域控信息。如果结果显示的DC名称是辅域控的主机名,说明客户端已经能够通过DNS找到新主域控了。
如果查找结果仍旧指向旧主域控,很可能是客户端的DNS缓存和Kerberos票据还没有刷新。执行:
ipconfig /flushdns klist purge然后再重新测试。如果还不生效,检查这台客户端的DNS服务器地址,它的首选DNS必须指向辅域控(或者正确的内部DNS),不能是旧主域控的IP。
5.3 常见残留症状与修复
自检过程中我最常遇到的一个问题是:部分用户出现间歇性的“找不到域控制器”报错,但过几分钟又恢复了。这种情况多半是DNS里的SRV记录Time-to-Live(TTL)还没有过期,客户端缓存里还保留着旧域控的记录。理论上一段时间后会自动消失,但为了尽快止血,可以手动刷新DNS记录并让客户端清缓存,前面的ipconfig /flushdns和klist purge就是干这个的。
还有一类残留症状是时间偏移。如果客户端开机后一直没和域内时间源同步过,而旧的PDC时间源又已经失效,有些电脑的时间可能慢慢偏离。等新PDC模拟器接管后,这些客户端即便重新认证,也可能因为时间偏差过大而失败。遇到这种情况,在故障客户端上手动执行:
w32tm /resync /rediscover如果时间偏移已经超过5分钟,先手动把时间调到接近正确值,再执行上面的/resync命令,否则同步会被安全加固拦截。
6. 这次事故教会我的几件事
每次出大故障都是一次免费的上课机会。我从这次主域控损坏事件里总结了不少东西,写在这里供同行参考。有些经验和命令本身无关,但对以后维护这个域、维护其他Windows环境,都有帮助。
6.1 单域控绝对不是“能省则省”
很多中小型企业觉得域里就几十台电脑,搭一台域控就够了,辅域控、额外域控的思路根本没考虑过。这次故障之所以能够快速恢复,全靠提前部署了这台辅域控,否则整个域陷入瘫痪,所有依赖AD认证的服务全部停摆,业务损失不可估量。
我的建议是:任何时候,一个域里至少要有两台域控。如果预算实在紧张,可以考虑用一台配置较低的虚拟机做辅助域控,只要保证时间同步和DNS正确,哪怕它性能弱一点,关键时刻顶上去也能撑住场面。
6.2 给域预留一条“备胎链路”
“备胎链路”的意思是:在日常运维里,不要把所有角色都压在一台机器上。
比如DNS服务,我会建议在辅域控上也装上DNS角色,并且把区域设置为与主域控同步,这样主域控挂了,DNS解析依然可用。再比如时间源,不要把PDC模拟器的NTP指向外部然后其他机器都直接指向它,一旦PDC挂了,整条时间链路就断了;正确做法是,即使主域控正常运行,也提前在辅域控上配置好外部NTP源,这样角色一夺过来,时间同步链路立即生效。
这次故障教会我一个特别简单的道理:备份域控不只是“备份”,它是在重大事故时刻全部的救援力量。
6.3 日常巡检清单
最后分享一份我后来整理的巡检清单,供大家参考,职能部门可以根据自己的环境调整:
- 每周用
dcdiag和repadmin跑一遍域内全部域控,确认复制正常 - 每月检查事件查看器里的Directory Service、DNS Server、File Replication Service日志
- 每季度做一次系统状态备份,并在测试环境中演练恢复
- 时刻关注域内所有服务器的时间同步状态,偏差超过2分钟就追查原因
这些动作平时看起来很机械,但真正遇到类似“主域控已损坏”这种事故时,你会发现每一次巡检都是给灾难恢复提前修的桥。
我这套操作从接到报警电话到全部清理完成,花了大概三个半小时,其中角色夺取只占十分钟,一半时间耗在体检、备份和元数据清理上。说实话,操作本身不难,难的是在半夜大脑不清醒的状态下,还能一步一步稳稳地走完流程。希望这篇经验能帮你少走两步弯路。