Windows Server 2003主辅域控搭建与FSMO迁移验收
简介:面向 Windows Server 2003 域环境运维学习者与系统管理员的实操文档,围绕主域控与辅助域控的部署及主域控制器迁移展开,适合需要理解活动目录多域控架构、FSMO 角色转移与故障接管的中初级技术人员参考。压缩包内为 1 个 docx 文件,约 566KB,以图文与命令行记录相结合的方式整理完整实验过程。内容覆盖通过 dcpromo 创建新林 Jiajie.com、配置 DNS 与 NETBIOS 名称、部署现有域额外域控制器并验证复制,以及利用 ntbackup 备份系统状态,在图形界面和 ntdsutil 命令行下转移或夺取 RID、PDC、基础结构、域命名、架构五类主机角色和全局编录。文档还归纳了 transfer 与 seize 命令的适用场景及参数差异,便于读者按实际环境对照排查,快速建立域控迁移的整体思路。已有 2064 人学习。
1. 主域控、辅助域控与主控制器迁移:一台老 Server 2003 实验环境里的三件正事
主域控、辅助域控的搭建以及主域控制器的迁移,这套流程我最近在一套完全隔离的 Windows Server 2003 Enterprise Edition 环境里从头走了一遍:两台机器,主机名分别记为 A 和 B,地址用 1.1.1.1/8 和 1.1.1.2/8,域名的 DNS 全名写成 jiajie.local。这里事前做了两处改动:原始笔记里用的是 .com 后缀,内网域在工程上应该用 .local 这类专用后缀承接,避免和公网解析冲突;管理员密码和管理员用于操作时输入的密码在文中也统一替换成占位值,真实环境里必须换成长口令。整套东西的价值不在“复古”,而在于它把域架构里最容易出问题的三个点一次性暴露出来:DNS 依赖、复制链路、FSMO 角色归属。适合正在维护存量 2003 环境、要在隔离环境复现故障、或者准备把一台老域控整体迁走的人拿来照着走。
2. 主域控落地:dcpromo 向导里十一个不能瞎点的选择
装主域控这一步,dcpromo一敲下去,后面每一步选择都会写进 AD 数据库,事后想改只有降级重来一条路。原料里那十一步向导流程本身没问题,但每一步背后的判断标准没写,照着点很容易在“DNS 全名”和“权限”两页上翻车。
2.1 先把地址、名字和时间定死
搭域之前,网络层必须先固定下来,不能靠 DHCP。域控的地址一旦漂移,DNS 里的 SRV 记录会指向一个不存在的 IP,客户端找域控就像拨一个空号。原始规划是主域控 A 用 1.1.1.1/255.0.0.0,辅助域控 B 用 1.1.1.2/255.0.0.0,B 的 DNS 指向 A。这个规划在隔离环境里成立,但 1.1.1.0/8 是公网上的知名地址段,任何一次误接入生产网络都会撞车,我自己踩过这个坑,后来一律换成 10.10.10.x 这种私有段。
# 在主域控 A 上固定地址与 DNS,避免续约后 SRV 记录指向错误地址 netsh interface ip set address "本地连接" static 10.10.10.1 255.0.0.0 10.10.10.1 netsh interface ip set dns "本地连接" static 10.10.10.1 primary # 在辅助域控 B 上固定地址,DNS 必须只指向主域控 netsh interface ip set address "本地连接" static 10.10.10.2 255.0.0.0 10.10.10.1 netsh interface ip set dns "本地连接" static 10.10.10.1 primarynetsh interface ip set address的四个参数依次是接口名、静态地址、子网掩码、默认网关。这里默认网关填自己是一个折中,隔离环境里不需要出网,但填一个不存在的网关会导致启动时等待超时,填本机地址最省事。set dns的primary关键字表示设置首选 DNS,B 的首选只能写 A 的地址,不能写 127.0.0.1,也不能追加公网 DNS。
时间这一项原料没提,但它是域环境里最容易被忽略的硬条件。域内 Kerberos 默认容忍 5 分钟时钟偏移,两台机器时间差超过阈值,表现为密码明明是对的却登录失败、复制报错、dcdiag一大堆告警。主域控最好手工把时间源指定到一个内网时间服务器,辅助域控走域层级同步。
# 主域控 A 对外同步时间,辅助域控 B 保持默认的域层级同步即可 w32tm /config /manualpeerlist:"10.10.10.250" /syncfromflags:manual /reliable:yes /update net stop w32time && net start w32time w32tm /resync/reliable:yes表示这台机器对外是可信时间源,/manualpeerlist写内网时间服务器地址,多个用空格分隔。辅助域控不要设这个参数,它会自动向域层级里的上级同步,人工指定反而容易和主域控拉开偏差。
命名上还有一个隐形限制:NETBIOS 名最长 15 个字符。DNS 全名可以很长,但 NETBIOS 名超长会被截断,后续如果加域的是老系统,登录框里根本认不出来。原始规划里 DNS 全名是 jiajie.local,NETBIOS 名是 JIAJIE,这个对应关系是规范的,域名取短、全大写、不含特殊符号。
2.2 向导里的四个关键选择,各有各的适用条件
第一页“域控制器类型”,选“新域的域控制器”,这是唯一正确的起点;选“现有域的额外域控制器”是给辅助域控用的,两者装错只能降级重来。
第二页“创建一个新域”,选“在新林中的域”。这一页还有“子域”和“新林中的域”两个选项,区别在于:选“新林中的域”会独立成一个林,和现有域没有任何信任关系;选“子域”则继承父域的架构和 schema,共用林级两个 FSMO 角色。实践里如果你只是要一个独立的测试域,新林最简单,不用去处理父子域的 DNS 委派。
第六步 DNS 全名填 jiajie.local,第七步 NETBIOS 名自动带出 JIAJIE。这里有个细节值得说:DNS 全名一旦写错,事后改是要跑rendom的,2003 环境里风险极高,写之前先确认拼写,别在最后一位上打错。
第八、九步是数据库、日志和共享系统卷的存储位置。默认落在C:\WINDOWS\NTDS和C:\WINDOWS\SYSVOL,测试环境无所谓,但如果这台机器将来要承载真实目录,把 NTDS 数据库和日志分到不同物理盘上是有意义的:日志是顺序写、数据库是随机写,分开能减少 IO 争用。SYSVOL 必须放在 NTFS 分区上,它会通过文件复制服务同步给所有域控。
第十步“DNS 注册诊断”,原料里的做法是选第二项。这一步的界面会先跑一遍诊断,如果 DNS 配置有问题,会出现两个选项:一是“在这台计算机上安装并配置 DNS 服务器,将新的域设置为使用该 DNS 服务器”,二是“只在这台计算机上安装并配置 DNS 服务器”。第一项会把本机 DNS 指向自己,第二项只装服务不改指向。对于单机首台域控,选第一项更省事,装完 SRV 记录会自动注册进去。如果诊断没有报错,这一步会直接跳过,说明这台机器已经能解析到合适的 DNS。
第十一步“权限”,两个选项分别是“与 Windows 2000 Server 操作系统兼容”和“只与 Windows Server 2003 操作系统兼容”。这个选择的实质是匿名 SID 和 Pre-Windows 2000 Compatible Access 组的宽松程度。选 2003 模式更严格、更安全,但环境里只要还留着一台 NT4 或 2000 的成员服务器,就要退回兼容模式,否则那台机器连不上来。这是个很典型的“看起来是安全选项、实际是兼容性选项”的地方。
最后是目录服务还原模式密码。原料里把它设成和管理员密码一样,这在测试环境省事,但生产里是两个权限概念完全不同的口令:还原模式密码只在目录服务离线还原时使用,泄露了等于能离线改目录库。建议单独设一个,并且记在能找得到的地方,这个密码没有后悔药,忘了只能重装域控。
2.3 装完不代表能用,四步现场验收
向导跑完会自动重启,重启之后dcpromo的日志会给你一个“安装完成”的结论,但真正能用还要验四件事。
第一步看共享。打开命令行敲net share,应该能看到NETLOGON和SYSVOL两个共享。这两个共享是组策略和登录脚本的落地点,只要有一个没出来,说明 SYSVOL 的 FRS 还没完成初始同步,2003 上这个过程可能要等十几分钟,期间客户端会报“找不到域”或者组策略处理失败。
第二步看 DNS 记录。打开 DNS 管理器,展开正向查找区域 jiajie.local,确认几个关键子目录存在:_msdcs、_sites、_tcp、_udp。再展开_tcp,里面应该有一串以_ldap、_kerberos、_kpasswd开头的 SRV 记录,指向A.jiajie.local。这些记录就是客户端“找域控”的唯一依据,缺一条,对应协议就直接失效。
# 从任何一台机器上手工验证 SRV 记录是否能解析出主域控 nslookup -type=SRV _ldap._tcp.dc._msdcs.jiajie.local nslookup -type=SRV _kerberos._tcp.jiajie.local-type=SRV表示查服务定位记录,_ldap._tcp.dc._msdcs.这一串是 LDAP 服务的标准命名,客户端开机加域时第一条查的就是它。返回结果里应该看到svr hostname = a.jiajie.local和端口 389。如果返回“非存在域”,基本上是 DNS 区域没建好或者动态更新被关了。
第三步跑一遍诊断。dcdiag和netdiag都不在系统里自带,需要在安装光盘的\SUPPORT\TOOLS目录里跑suptools.msi装上。装完在命令行里敲dcdiag /v,重点看 Connectivity、Advertising、Frssysvol、KccEvent 这几项是不是 PASS。Advertising 这一项尤其关键,它验证的是这台域控有没有把自己正常“广播”到 DNS 里,失败意味着复制和客户端发现都会出问题。
第四步看事件日志。目录服务日志里不该有 1083、1355、1864 这类级别的错误,文件复制服务日志里不该有 JRNL_WRAP_ERROR。前一类多半是 DNS 或权限问题,后一类是 FRS 日志被覆盖,意味着 SYSVOL 同步已经断了,需要做非权威还原。
2.4 用应答文件把安装变成可复现的
图形向导点一遍还行,要装第二遍、第三遍就容易漏步骤。dcpromo支持应答文件,把上面那些选择写进一个 ini,安装就变成一条命令。
; 主域控无人值守安装应答文件 dcpromo_main.txt [DCInstall] ReplicaOrNewDomain=Domain NewDomain=Forest NewDomainDNSName=jiajie.local DomainNetbiosName=JIAJIE ForestLevel=2 DomainLevel=2 InstallDNS=Yes ConfirmGc=Yes CreateDNSDelegation=No DatabasePath="C:\WINDOWS\NTDS" LogPath="C:\WINDOWS\NTDS" SysvolPath="C:\WINDOWS\SYSVOL" SafeModeAdminPassword=Lab@2003 RebootOnCompletion=YesForestLevel和DomainLevel的取值 2 对应 Windows Server 2003 模式,取 0 是 Windows 2000 混合模式、1 是 Windows 2000 本机模式,这就是图形界面里“权限”那一页对应的参数。InstallDNS=Yes对应前面说的“在这台计算机上安装并配置 DNS 服务器”。CreateDNSDelegation=No是因为这是林根域,没有上级区域可以委派。SafeModeAdminPassword就是目录服务还原密码,这里必须写明文,应答文件因此要当敏感文件处理,装完立刻删掉或锁权限。
# 执行应答文件安装 dcpromo /answer:C:\setup\dcpromo_main.txt/answer:后面跟绝对路径,参数名不区分大小写。执行前确认这台机器的工作组名和计算机名已经改好,dcpromo不会替你改主机名。装完重启,再用前面四步验收一遍,主域控这块就算立住了。
3. 辅助域控(额外域控制器)搭建:复制链路比安装向导更值得盯
额外域控制器的安装向导只有八步,比主域控还短,但它失败的概率高得多,因为多了一个“能不能连上现有域”的前置条件。原料里那句“检查主辅是否相通”看着轻描淡写,实际上这里出的问题占了我遇到的额外域控故障的七八成。
3.1 地址、DNS 和连通性,三件必须先做完的事
额外域控的地址规划是死规矩:IP 用同网段的另一个地址,子网掩码和主域控一致,网关随意(隔离环境填自己),DNS 首选必须是主域控的 IP。
这条 DNS 规则在装之前和装之后还不一样。装之前,B 的 DNS 指向 A,是为了让 B 能解析出 jiajie.local 和那些 SRV 记录;装完之后,B 自己也是域控了,DNS 可以改成指向自己,但通常保留指向 A 更稳,因为 A 才是 DNS 区域的主副本所在。这里最常见的错误是把公网 DNS 追加上去,一旦客户端的解析请求在 A 那里超时,就会跑到公网 DNS 去问“jiajie.local 在哪”,得到一个“查无此域”的答复然后放弃,表现为时好时坏的登录失败。
连通性检查不能只 ping 通就算完。ping 走的是 ICMP,域控之间真正要通的是 53(DNS)、88(Kerberos)、135(RPC 终结点映射)、389(LDAP)、445(SMB)、636(LDAPS)、3268(全局编录)。2003 默认没有开防火墙,理论上全通,但只要中途有一台机器开了自带防火墙或者装了第三方安全软件,最先挂的就是 135 端口的 RPC 定位,dcpromo会卡在“正在配置 Active Directory”那一屏很久然后报错。
# 在辅助域控 B 上确认能解析出主域控的服务记录 ping -n 2 10.10.10.1 nslookup -type=SRV _ldap._tcp.dc._msdcs.jiajie.local nslookup -type=SRV _gc._tcp.jiajie.local # 确认 RPC 和 LDAP 端口可达 telnet 10.10.10.1 135 telnet 10.10.10.1 389telnet在 2003 上需要先启动 Telnet 客户端服务,或者直接用portqry这个支持工具包里的命令行工具。连不上 135 的时候不要急着改 DNS,那通常是安全软件或者路由的问题。_gc._tcp这条记录查的是全局编录,首台域控默认就是 GC,返回结果里应该有a.jiajie.local:3268。
还有一条容易被忽略:B 的计算机名不能和 A 一样,也不能和域里任何一个已有对象重名。重名的情况下dcpromo报的错很含糊,只说无法创建账户,实际原因要去看事件日志里的 2089 或者 NTDS 复制错误。
3.2 向导里选“现有域的额外域控制器”之后
第一页选“现有域的额外域控制器”,这是和主域控安装唯一的分叉点。选完之后向导会要你提供凭据,这里要输入的是有权限在域里创建域控制器账户的账号,也就是 Domain Admins 组成员,如果这个域不是新林的第一台,还需要 Enterprise Admins 权限。
用户名:JIAJIE\administrator 密码: (主域控管理员口令) 域: jiajie.local凭据这一步的报错信息非常不友好,只要账号密码或者 DNS 解析任何一个环节有问题,统一提示“无法联系到 Active Directory 域控制器”。排查顺序我一般固定成三步:先nslookup jiajie.local确认域名能解析出 A 的 IP,再nslookup -type=SRV确认 SRV 记录在,最后用这个账号在主域控上登录一次确认口令没过期。三步都过还报错,才去怀疑网络和防火墙。
下一屏要输入“额外的域控制器域名”,填 jiajie.local。再往下是数据库、日志和 SYSVOL 的位置,和主域控一样的道理,测试环境全默认。最后一屏是目录服务还原密码,原料里设成了和主域控一样的值,这个在测试环境方便记忆,但在真实环境里每台域控的还原密码应该独立,因为任何一台的还原密码泄露都等于给了攻击者一个离线改目录的入口。
安装过程比主域控长,因为要从 A 复制整个目录数据库和 SYSVOL 过来。这个阶段最关键的现象是:向导界面上停在“正在配置 Active Directory”,实际上后台在做初始复制,如果网络慢或者目录对象多,卡一两个小时都正常。这个阶段千万不要强行重启,中断初始复制的域控会处于一种半残状态,后续要么重装要么做权威还原。
装完重启,第一件事是确认 B 在Domain Controllers这个 OU 下面。打开“Active Directory 用户和计算机”,展开Domain Controllers容器,应该能看到 A 和 B 两台计算机对象,B 的类型显示为“域控制器”。如果 B 落在Computers容器里,说明它的角色没写对,那它就是一个普通加域的成员服务器,不是域控。
3.3 复制到底通没通,用这三个命令看
原料里那句“经测试,主域控制器的数据能及时复制到辅助域控上面”是个结论,但没说怎么测。手工测法很简单:在 A 上建一个测试用户,然后到 B 上打开 AD 用户和计算机,看这个用户出不出来,出来说明复制通了,等十几分钟还不出来就是断了。
命令行测法更可靠,repadmin和dcdiag都在支持工具包里。
# 查看 B 上的入站复制伙伴和最近一次复制结果 repadmin /showrepl b.jiajie.local # 看整个林的复制健康度摘要,重点看 largest delta 和错误数 repadmin /replsummary # 强制从 A 立即复制一次到 B,不用等自动调度 repadmin /replicate b.jiajie.local a.jiajie.local "DC=jiajie,DC=local"/showrepl的输出里,每个命名上下文(这里就是DC=jiajie,DC=local和三个林级分区)会列出上次复制成功的时间和结果码,结果码 0 表示成功,8451、8452 之类表示复制调用失败。/replsummary的largest delta是两个站点间最久没同步的时长,超过一小时基本可以判定复制调度出了问题。/replicate的第三个参数是命名上下文 DN,写错会提示找不到分区。
图形界面里也有等价操作:打开“Active Directory 站点和服务”,展开Sites → Default-First-Site-Name → Servers → B → NTDS Settings,右侧会列出从 A 复制的连接对象,右键选“立即复制”即可。这个操作和命令行/replicate效果一样,区别是图形界面会弹一个结果框。
# 复制专项诊断,只看复制相关的测试项 dcdiag /test:replications /v dcdiag /test:advertising /v/test:replications会逐个命名上下文检查复制状态,/test:advertising检查这台域控有没有把自己正确注册到 DNS 里。这两个测试在刚装完额外域控的时候特别值得跑一遍,因为它们能把“装成功了但没真通”这种状态揪出来。
3.4 全局编录和多主复制,先把概念摆正
到了这一步有必要把两个概念说清楚,否则后面的 FSMO 迁移会一直糊着。
第一个是多主复制。2003 的 AD 是多主模型,任何一台域控都能接受目录修改,修改再通过复制同步到其他域控。这就是为什么 A 和 B 上都能建用户、改密码。但多主模型有个副作用:两台域控同时改同一个对象的同一个属性,会产生冲突,最后按版本号和属性版本号决胜。所以额外域控装完不是“备份机”,它是一台能独立接活的完整域控,这点和主备数据库的思路完全不同。
第二个是全局编录。GC 是一台域控上的特殊角色,它保存了本域所有对象的完整副本,以及林中其他域的对象的部属性副本。客户端登录时如果本地域控不是 GC,遇到跨域的资源访问就要去问 GC,问不到就可能出现“找不到用户”或者登录特别慢。首台域控默认就是 GC,这个可以在“Active Directory 站点和服务”里,右键B → NTDS Settings → 属性,看“全局编录”那个勾有没有打上。
单域单林的环境里,两台域控都做 GC 是常规做法,好处是任何一台挂掉另一台都能独立承接登录。但如果这个林将来要加子域,就要注意一条老规矩:基础结构主机不能同时是 GC,除非所有域控都是 GC,或者只有单一域。这条规矩在迁移时特别容易踩,后面避坑章节还会再提一次。
到这里,主域控加辅助域控的双机结构就算完整了。原料里说“主域控制器的数据能及时复制到辅助域控上面”,验证方式就是前面那三个命令加上手工建对象的对比,结论是可信的——但“能复制”和“能接管”是两回事,接管要靠 FSMO 角色迁移。
4. FSMO 五角色迁移:图形界面和 ntdsutil 两条路走一遍
域内所有域控在权限上是对等的,唯独五个操作不能多主,必须有唯一的持有者,这就是 FSMO。它分成两级:林级两个,域级三个。原料里的图形界面流程和命令行流程我都走了一遍,两种方式各有适用场景,图形界面适合第一次做、能看见每一步,命令行适合批量或者远程。
4.1 五个角色分别管什么,什么时候该迁
先把角色职责摆清楚,不然迁移时容易漏掉一两个。
| 角色 | 级别 | 职责 | 不迁的后果 |
|---|---|---|---|
| 架构主机 Schema Master | 林 | 控制 schema 的修改,全林唯一 | 无法扩展架构,装 Exchange 之类会直接失败 |
| 域命名主机 Domain Naming Master | 林 | 控制域的增删、应用分区的增删 | 无法新建或删除域 |
| RID 主机 RID Master | 域 | 给各域控分配 RID 池,对象 SID 的后半段从这来 | RID 池耗尽后无法创建新安全主体 |
| PDC 仿真主机 PDC Emulator | 域 | 密码变更的优先复制目标、时间同步源、老客户端兼容 | 改密码后老系统登录不上,时间源混乱 |
| 基础结构主机 Infrastructure Master | 域 | 维护跨域对象引用的更新 | 跨域组的成员变更显示为 SID 而非名称 |
一个单域单林的环境里,这五个角色初始都在同一台机器上,也就是首台域控 A。什么时候需要迁?两种情况:一是准备把这台老机器退役,角色必须先迁走才能降级;二是这台机器硬件不稳或者要做长时间维护,角色迁到 B 上让业务继续跑。如果只是日常巡检,完全没必要动,迁移本身是有风险的操作。
判断角色当前在哪台机器上,最省事的命令是netdom,它也在支持工具包里。
# 一次性列出五个 FSMO 角色的当前持有者 netdom query fsmo # 也可以用 dsquery 分角色查,2003 系统自带,不用装支持工具 dsquery server -hasfsmo schema dsquery server -hasfsmo domaindns dsquery server -hasfsmo rid dsquery server -hasfsmo pdc dsquery server -hasfsmo infrastructurenetdom query fsmo输出五行,每行一个角色加持有者名称,这是最快的确认方式。dsquery server -hasfsmo的取值分别是schema、domaindns、rid、pdc、infrastructure,注意域命名主机在这里写的是domaindns而不是domainnaming,写错会提示无效参数。迁移前后各跑一次,对比结果就知道迁干净没有。
4.2 迁移前必须先做的 system state 备份
原料把备份放在迁移步骤的第一条,这个顺序是对的,而且比它写得更严格——备份不只是做一次,是做完之后要做一次还原验证,否则你并不知道这个备份能不能用。
# 用系统自带的 ntbackup 备份 system state 到非系统盘 ntbackup backup systemstate /j "DC-A-Before-FSMO" /f "D:\backup\dc_a_systemstate.bkf" /l:sbackup systemstate是备份类型参数,它会把注册表、COM+ 类注册数据库、系统启动文件、证书服务数据库和 Active Directory 一起打包。/j是作业名,写在日志里方便回溯。/f是目标文件路径,一定要放在非系统盘上,放系统盘等于没备份。/l:s表示只写摘要日志,取值f是完整日志、n是不写日志。
系统状态备份只覆盖 AD 数据库和 SYSVOL 的一部分,DNS 区域如果是 AD 集成的那就在里面,如果是标准区域文件,要单独把C:\WINDOWS\system32\dns目录拷出来。另外还要记一份当前的角色归属清单,也就是刚才netdom query fsmo的输出,出问题时至少知道该往哪回。
提示:备份文件要在另一台机器上也留一份。域控本身挂了的时候,备份和域控在同一个盘上,等于没有备份。
4.3 图形界面迁移前三个角色:RID、PDC、基础结构
这三个都是域级角色,操作入口都在“Active Directory 用户和计算机”。关键动作是第一步:先把管理控制台连接到目标域控 B,否则你点“更改”的时候,改的是当前连着的这台机器的角色,很容易出现“点了没反应”或者“提示已经是本机”的怪现象。
1. 在 B 上打开 "Active Directory 用户和计算机" 2. 右键域节点 jiajie.local → 连接到域控制器 → 选中 B → 确定 3. 再次右键域节点 → 操作主机 4. RID 选项卡 → 更改 → 是 5. PDC 选项卡 → 更改 → 是 6. 基础结构 选项卡 → 更改 → 是第 2 步的“连接到域控制器”是整个流程里最容易被跳过的一步。跳过之后,控制台默认连的是本机,而本机此刻还不是角色持有者,点“更改”实际是把角色从 A 抢到当前连接的 DC 上,如果当前连的还是 A,就会出现“操作主机已经是这台计算机”的提示,看起来像失败了,其实什么都没发生。
“更改”按钮在角色已经在本机时会灰掉,这也是判断有没有连对目标的一个直观信号。三个角色迁完之后,每个选项卡上显示的当前操作主机都应该是 B。
基础结构主机这一项有个额外条件要留意:如果 B 是全局编录,而林里还有别的域,基础结构主机会失效。原料这套是单域,不受影响,但如果将来扩成多域,要么把基础结构主机放在非 GC 的域控上,要么把所有域控都设成 GC。这条规则在 2003 时代是硬约束,很多“跨域组成员显示成 SID”的怪问题都源于此。
4.4 域命名主机和架构主机:入口藏得比较深
域命名主机的入口在另一个控制台里。“Active Directory 域和信任关系”打开后,同样是先右键根节点连接到 B,再右键根节点选“操作主机”,点“更改”。
1. 打开 "Active Directory 域和信任关系" 2. 右键根节点 → 连接到域控制器 → 选中 B → 确定 3. 右键根节点 → 操作主机 → 更改 → 是架构主机的入口默认根本不显示,要先注册一个管理单元 DLL,再用 MMC 手工添加。
# 注册架构管理单元,注册成功会弹出 DllRegisterServer 成功的提示 regsvr32 schmmgmt.dll # 打开空白 MMC 控制台 mmc注册完之后,在 MMC 里按Ctrl+M打开“添加/删除管理单元”,在列表里找到“Active Directory 架构”,依次点“添加”“关闭”“确定”。接着右键“Active Directory 架构”节点,选“更改域控制器”,点“指定名称”,输入 B 的计算机名或者完整名称B.jiajie.local,确定之后再右键选“操作主机”,点“更改”。
regsvr32 schmmgmt.dll这一步失败的情况不少,常见原因是文件本身缺失或者被安全软件拦了。schmmgmt.dll在C:\WINDOWS\system32下,正常情况下是存在的,如果报“找不到模块”,先确认路径写全了没有,再确认这台机器的系统文件有没有被精简过。
4.5 ntdsutil 命令行:transfer 和 seize 是两件完全不同的事
图形界面适合做一次,命令行适合反复做和在脚本里做。ntdsutil的路径是固定的:进工具、进 roles 上下文、连目标服务器、退出连接上下文、执行转移。
ntdsutil roles connections connect to server b.jiajie.local quit transfer RID master transfer PDC transfer infrastructure master transfer domain naming master transfer schema master quit quitconnect to server后面跟的是目标域控的完整名称,成功后会有“已连接到服务器”的提示。连接上下文里执行完quit会回到fsmo maintenance提示符,这时候才能执行transfer。每条transfer执行完会弹一个确认框,选“是”完成操作。最后两个quit分别退出 roles 上下文和 ntdsutil 本体。
原料给出的转移命令表我原样保留,但补一列说明适用条件:
| 命令 | 含义 | 适用场景 |
|---|---|---|
transfer PDC | 转移 PDC 仿真主机 | 两台域控都在线,正常交接 |
transfer RID master | 转移 RID 主机 | 两台域控都在线,正常交接 |
transfer infrastructure master | 转移基础结构主机 | 两台域控都在线,正常交接 |
transfer domain naming master | 转移域命名主机 | 两台域控都在线,正常交接 |
transfer schema master | 转移架构主机 | 两台域控都在线,正常交接 |
seize PDC | 强行占用 PDC 仿真主机 | 原持有者已离线且不会再回来 |
seize RID master | 强行占用 RID 主机 | 原持有者已离线且不会再回来 |
seize infrastructure master | 强行占用基础结构主机 | 原持有者已离线且不会再回来 |
seize domain naming master | 强行占用域命名主机 | 原持有者已离线且不会再回来 |
seize schema master | 强行占用架构主机 | 原持有者已离线且不会再回来 |
这两组命令的区别必须说透:transfer是协商式的,要求原持有者在线并把角色正常交接出去;seize是抢占式的,不管原持有者状态,直接在目标机上把角色认下来。用seize之后,原持有者如果还能启动,它会以为自己仍然持有这个角色,两台机器同时认为自己有唯一的写权限,后果是目录数据分裂,这种状态很难修。
所以判断标准只有一条:原持有者能不能回来。能回来就用transfer,回不来才用seize,并且seize之后要立刻对原机器做元数据清理,不让它再以域控身份启动。
迁移完成,用前面那条netdom query fsmo再跑一遍,五行输出都应该指向 B。原料里写的“到此为止,五大主机和全局编录已经迁移完毕”,全局编录那一块是另一套操作,在“Active Directory 站点和服务”里,先把 A 的NTDS Settings属性里的全局编录勾去掉,再把 B 的勾打上,顺序不能反——先取消 A 再勾 B,中间会有一小段时间林里没有 GC,如果这个空窗期有客户端登录,可能失败,最好放在业务空闲时段做。
5. 避坑与排查:五个当场让人冒汗的现象
下面这五条都是我在这套环境里真实撞过的,每条按现象、原因、解决写,遇到的时候可以直接对着查。
5.1 dcpromo 报“无法联系到域控制器”,但 ping 明明是通的
现象:在辅助域控 B 上跑dcpromo,填完凭据那一步,等半分钟弹“无法联系到 Active Directory 域控制器”,但ping 10.10.10.1完全正常,共享也能访问。
原因:dcpromo找域控靠的不是 ICMP,是 DNS 里的 SRV 记录。DNS 首选指向了公网服务器,或者指向了 B 自己(此时 B 还没有 DNS 区域),解析 jiajie.local 得到“非存在域”,凭据验证直接失败。另一种情况是 DNS 指向正确但_msdcs子域被删了,SRV 记录查不到。
解决:把 B 的 DNS 首选改成 A 的地址,用nslookup -type=SRV _ldap._tcp.dc._msdcs.jiajie.local确认能解析出 A 的主机名和 389 端口,再重跑dcpromo。如果 SRV 记录本身缺失,到 A 上打开 DNS 管理器,检查_msdcs区域是否随 AD 集成区域一起存在,必要时重启 A 的 Netlogon 服务触发重新注册。
5.2 额外域控装完,repadmin 显示复制失败,错误码 8524
现象:B 装完重启,repadmin /showrepl里所有命名上下文都是红色,错误码 8524 或者 1722,提示“DSA 操作无法继续”。
原因:8524 是 RPC 层面连不上,通常有两个来源。一是两台机器时间差超过 5 分钟,Kerberos 票据直接失效,看起来像网络问题。二是 B 的 DNS 里同时存在多条指向 A 的 A 记录,其中一条是错的旧地址,复制请求打到旧地址上超时。
解决:先在两台机器上跑w32tm /resync对齐时间,再在 DNS 管理器里检查 jiajie.local 区域下 A 的 A 记录是不是只有一条、地址对不对。改完之后用repadmin /replicate手工触发一次,成功后再跑repadmin /replsummary确认最大延迟降下来。
5.3 架构主机那个“更改”按钮是灰的,点了没反应
现象:regsvr32 schmmgmt.dll提示注册成功,MMC 里也加上了“Active Directory 架构”,但右键“操作主机”之后,“更改”按钮灰着,或者点了提示当前已经是这台计算机。
原因:MMC 里的架构管理单元默认连的是本机,而本机此刻还不是架构主机持有者,所以“更改”按钮的语义是“把角色从当前持有者改到当前连接的这台机器”,按钮灰掉说明当前连接的目标已经是持有者,或者当前连接的目标根本不可写。
解决:右键“Active Directory 架构”,先“更改域控制器”并指定 B,确定之后再进“操作主机”。如果按钮仍然灰,检查当前登录账号是不是 Schema Admins 组成员——这个组的成员资格是迁架构主机的前提,不在组里连菜单都点不动。
5.4 全局编录迁移完了,两台机器上都没打勾
现象:按流程把 A 的 GC 勾去掉、给 B 打上勾,过一会儿回看,发现 A 和 B 的“全局编录”勾都没了,客户端登录变得极慢,事件日志里出现 1126 错误。
原因:去 A 的勾和给 B 打勾之间有时间差,如果 B 打勾那一步没有真正写进配置(比如属性页关掉时点了取消,或者 AD 复制还没把变更同步出去),就会形成空窗。另外如果操作时连接的不是 B 而是本机,勾打在了错误的机器上。
解决:在“Active Directory 站点和服务”里右键B → NTDS Settings → 属性,重新确认“全局编录”勾选状态并点应用;等几分钟让配置分区复制出去,再在 A 上确认勾已去掉。用nslookup -type=SRV _gc._tcp.jiajie.local验证 GC 记录指向的是 B。这个操作最好在业务低峰做,空窗期越短越好。
5.5 用 seize 强行夺权之后,原域控一开机就出乱子
现象:A 硬件故障直接下线,在 B 上用seize把五个角色全抢了过来,业务恢复。几天后 A 修好重新开机,域内开始出现复制冲突、部分用户登录时好时坏,事件日志里大量 2095 和 1863。
原因:A 的目录数据库里仍然记录着自己持有那五个角色,它开机后照常对外服务,两台机器同时认为自己有唯一的写权限,RID 池分配和架构修改都会打架。这是seize最典型的后遗症。
解决:A 修好之后不要直接接入网络,先做元数据清理,把它从 AD 里彻底摘掉;如果确实要让 A 重新做域控,就重装系统再以额外域控身份重新加入。清理用ntdsutil的 metadata cleanup 上下文完成,删掉 A 的服务器对象、它的 NTDS Settings 对象和对应的复制连接。清理完再开机接入网络,冲突才会消失。
6. 迁完之后的验收:一份照着敲就能确认的清单
迁移这类操作,做完那一刻的“看起来成功”和真正的“干净”之间隔着一段距离。我现在的习惯是,不管走图形界面还是命令行,收尾一定把这套动作固定走一遍,少一步都不算完。
先把角色归属再确认一次,这是最硬的指标:
# 五个角色必须全部指向新的持有者 B netdom query fsmo # 检查目录分区复制是否全部收敛 repadmin /replsummary dcdiag /test:replications /v dcdiag /test:advertising /vnetdom query fsmo的输出里五行都应该是B.jiajie.local,只要有一行还是 A,就说明那个角色没迁成功,回到ntdsutil里补一次。repadmin /replsummary关注两列:最大延迟和失败数,延迟应该在一小时以内,失败数应该是 0。
再把这张表逐项对一遍,每项都有明确的判定标准:
| 检查项 | 判定标准 | 出问题时先看哪 |
|---|---|---|
| FSMO 归属 | 五个角色全在 B | netdom query fsmo输出 |
| 全局编录 | B 勾选、A 已取消 | _gc._tcp的 SRV 记录 |
| SYSVOL 共享 | A、B 上net share都有 SYSVOL | 文件复制服务日志 |
| DNS 区域 | A、B 上都能解析_msdcs下的 SRV | DNS 管理器正向区域 |
| 复制延迟 | largest delta小于一小时 | repadmin /showrepl错误码 |
| 时间同步 | 两台机器时间差在 5 分钟内 | w32tm /query /status |
表格里最容易被忽略的是 SYSVOL 那一项。FSMO 迁完不代表 SYSVOL 的复制拓扑也跟着调整,如果 A 要退役,B 必须能独立提供 SYSVOL,否则组策略和登录脚本会失效。验证方法是把 A 关机,在 B 上打开\\jiajie.local\SYSVOL看能不能访问,能访问并且策略能正常下发,才算真接管。
还有一个进阶技巧值得单独提一句:ntdsutil里除了 roles 上下文,还有一个files上下文,可以检查 SYSVOL 的复制状态并做非权威还原。当dcdiag报 Frssysvol 失败、事件日志出现 JRNL_WRAP_ERROR 的时候,标准做法就是在这个上下文里先reset再non-authoritative restore,然后重启 FRS 服务让它从 A 重新拉一份完整的 SYSVOL。这个操作比删掉 SYSVOL 目录重建安全得多,别图快直接删文件。
最后说一条我自己的血泪教训。第一次做这套迁移的时候,我图省事,只做了transfer没做备份,迁到一半发现架构主机那一步因为账号不在 Schema Admins 组里卡住了,角色处于一个“RID 已经到 B、架构还在 A”的中间态,两台机器都不完整。那之后我每次动 FSMO 之前,都会强制走一遍 system state 备份加角色清单打印,并且提前确认操作账号在 Schema Admins 和 Enterprise Admins 里——这两件事加起来不到十分钟,但能把回滚的余地留出来。整理好的应答文件模板、ntdsutil命令清单和这份验收表我都归在同一个目录里,照着替换域名和地址就能直接跑,希望帮到你。
本文还有配套的精品资源,点击获取