Windows AD PowerShell(四):域控与 FSMO
这是 Windows AD PowerShell 学习记录的第四节,主要整理域控制器(Domain Controller,DC)、FSMO 角色、全局编录(Global Catalog,GC)和域林功能级别的查询与排查方法。
本节中的域控、站点、FSMO 持有者和功能级别均通过实验环境进行了只读核对;角色转移、角色夺取和功能级别提升等写操作没有实际执行。
四、域控与 FSMO
4.1 查询域中的所有域控制器
Get-ADDomainController -Filter * | Sort-Object Name | Select-Object Name,HostName,Site,IsGlobalCatalog,IsReadOnly, OperatingSystem,OperatingSystemVersion
Name : QYNET-CORE01HostName : QYNET-CORE01.qy.netSite : QYNET-COREIsGlobalCatalog : TrueIsReadOnly : FalseOperatingSystem : Windows Server 2016 Datacenter EvaluationOperatingSystemVersion : 10.0 (14393)
Name : QYNET-CORE02HostName : QYNET-CORE02.qy.netSite : QYNET-COREIsGlobalCatalog : TrueIsReadOnly : FalseOperatingSystem : Windows Server 2016 Datacenter EvaluationOperatingSystemVersion : 10.0 (14393)当前实验域有两台可写域控制器,均位于 QYNET-CORE 站点,并且都是全局编录服务器。
| 字段 | 含义 |
|---|---|
Name | 域控制器的计算机名称 |
HostName | 域控制器的完整 DNS 名称 |
Site | 域控制器所属的 AD 站点 |
IsGlobalCatalog | 是否为全局编录服务器 |
IsReadOnly | 是否为只读域控制器(RODC) |
OperatingSystem | 域控制器的操作系统 |
OperationMasterRoles | 当前 DC 持有的 FSMO 角色 |
Get-ADDomainController 返回对象,不代表服务器当前一定在线;在线状态还要结合 DNS、端口、复制和服务状态判断。
4.2 五个 FSMO 角色
AD 大部分目录修改采用多主复制,但少数操作必须由唯一角色持有者处理,以避免冲突。
| FSMO 角色 | 范围 | 主要职责 | 长期不可用的影响 |
|---|---|---|---|
| Schema Master | 林级 | 控制 Schema 修改 | 无法正常扩展或修改 Schema |
| Domain Naming Master | 林级 | 控制域和目录分区的添加、删除 | 无法正常添加或删除域 |
| PDC Emulator | 域级 | 时间源、密码优先复制、账户锁定 | 时间、密码验证和部分管理操作异常 |
| RID Master | 域级 | 给各 DC 分配 RID 池 | RID 池耗尽后无法创建新安全主体 |
| Infrastructure Master | 域级 | 更新跨域对象引用 | 多域环境中的跨域引用可能不一致 |
💡 每个林只有一个 Schema Master 和一个 Domain Naming Master;每个域各有一个 PDC Emulator、RID Master 和 Infrastructure Master。多域林中的 FSMO 总数会超过五个。
PDC Emulator 在日常排障中尤其重要:
- 林根域的 PDC Emulator 是整个林时间层级的权威源。
- 用户刚修改密码后,其他 DC 验证失败时会优先询问 PDC。
- 账户锁定信息会优先发送给 PDC。
- 一些组策略和旧式管理工具会优先连接 PDC。
4.3 查询 FSMO 角色持有者
netdom query fsmo
Schema master QYNET-CORE01.qy.netDomain naming master QYNET-CORE01.qy.netPDC QYNET-CORE01.qy.netRID pool manager QYNET-CORE01.qy.netInfrastructure master QYNET-CORE01.qy.netThe command completed successfully.当前五个 FSMO 角色全部由 QYNET-CORE01 持有。这在单域、小型环境中很常见,但维护该 DC 前要特别关注角色影响。
纯 PowerShell 查询方式:
# 两个林级角色Get-ADForest | Select-Object SchemaMaster,DomainNamingMaster
SchemaMaster DomainNamingMaster------------ ------------------QYNET-CORE01.qy.net QYNET-CORE01.qy.net
# 三个域级角色Get-ADDomain | Select-Object PDCEmulator,RIDMaster,InfrastructureMaster
PDCEmulator RIDMaster InfrastructureMaster----------- --------- --------------------QYNET-CORE01.qy.net QYNET-CORE01.qy.net QYNET-CORE01.qy.net查询每台 DC 当前持有的角色:
Get-ADDomainController -Filter * | Sort-Object Name | Select-Object Name, @{Name="OperationMasterRoles";Expression={ $_.OperationMasterRoles -join ", " }}
Name OperationMasterRoles---- --------------------QYNET-CORE01 PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMasterQYNET-CORE02QYNET-CORE02 后面为空不表示故障,只表示它当前不持有 FSMO,仍可处理普通认证、LDAP 查询和目录复制。
4.4 检查 FSMO 健康状态
netdom query fsmo 只能说明角色记录指向谁,不能证明持有者当前可达或服务健康。
dcdiag /test:fsmocheck
Starting test: FsmoCheck ......................... QYNET-CORE01 passed test FsmoCheck需要详细过程时增加 /v,也可以指定一台 DC:
dcdiag /test:fsmocheck /v
dcdiag /s:QYNET-CORE02 /test:fsmocheck排障时应检查是否出现 Warning、Error、DsGetDcName 失败、DNS 解析失败、RPC 或复制错误。
$pdc = (Get-ADDomain).PDCEmulator
Resolve-DnsName $pdcTest-NetConnection -ComputerName $pdc -Port 389Test-NetConnection -ComputerName $pdc -Port 135
repadmin /replsummary
Get-ADReplicationFailure -Target * -Scope Forest | Select-Object Server,FirstFailureTime,FailureCount,LastError网络测试结果取决于实际 IP 和防火墙。Get-ADReplicationFailure 没有输出时,表示本次查询没有发现复制失败,但仍应结合 repadmin、事件日志和 DNS 判断。
+
4.5 查询全局编录服务器
Get-ADDomainController -Filter * | Sort-Object Name | Select-Object Name,Site,IsGlobalCatalog
Name Site IsGlobalCatalog---- ---- ---------------QYNET-CORE01 QYNET-CORE TrueQYNET-CORE02 QYNET-CORE True只列出 GC:
Get-ADDomainController -Filter { IsGlobalCatalog -eq $true} | Select-Object Name,HostName,Site
Name HostName Site---- -------- ----QYNET-CORE01 QYNET-CORE01.qy.net QYNET-COREQYNET-CORE02 QYNET-CORE02.qy.net QYNET-COREGC 常用于全林搜索、通用组成员身份、用户登录,以及 Exchange 等依赖全局编录的服务。
| 协议 | 端口 | 用途 |
|---|---|---|
| LDAP | 389 | 普通 LDAP 查询 |
| LDAPS | 636 | TLS 加密的 LDAP |
| Global Catalog | 3268 | GC 查询 |
| Global Catalog over TLS | 3269 | TLS 加密的 GC 查询 |
Test-NetConnection -ComputerName QYNET-CORE01.qy.net -Port 3268
ComputerName : QYNET-CORE01.qy.netRemotePort : 3268TcpTestSucceeded : True💡 GC 与 FSMO 不是一回事:GC 可以部署在多台 DC 上;同一个 FSMO 角色在对应范围内只能有一个持有者。当前两台 DC 都是 GC,但只有
QYNET-CORE01持有 FSMO。
在多域林中,传统建议是不要让 Infrastructure Master 与 GC 位于同一台 DC。不过,如果林中只有一个域,或者该域全部 DC 都是 GC,这个限制通常不构成问题。当前 qy.net 是单域,且两台 DC 都是 GC,因此该布局合理。
4.6 查询域和林功能级别
Get-ADDomain | Select-Object DomainMode,Forest
DomainMode Forest---------- ------Windows2016Domain qy.net
Get-ADForest | Select-Object ForestMode
ForestMode----------Windows2016Forest一次整理域林状态:
$domain = Get-ADDomain$forest = Get-ADForest
[pscustomobject]@{ Domain = $domain.DNSRoot DomainMode = $domain.DomainMode Forest = $forest.Name ForestMode = $forest.ForestMode DomainControllers = (Get-ADDomainController -Filter *).Count}
Domain : qy.netDomainMode : Windows2016DomainForest : qy.netForestMode : Windows2016ForestDomainControllers : 2功能级别决定 AD DS 可使用的功能,并限制能够作为 DC 加入环境的 Windows Server 版本;它不会限制普通成员服务器或客户端操作系统。
⚠️ DC 操作系统版本不等于功能级别。Windows Server 2019 和 Windows Server 2022 仍可运行在 Windows Server 2016 功能级别的林中。提升功能级别前,应确认全部 DC 版本、SYSVOL 复制方式、复制健康和备份。
以下命令仅用于预演:
Set-ADDomainMode -Identity "qy.net" -DomainMode Windows2016Domain -WhatIf
Set-ADForestMode -Identity "qy.net" -ForestMode Windows2016Forest -WhatIf当前环境已经是 Windows Server 2016 域和林功能级别,不需要重复提升。
4.7 PDC Emulator 与时间同步
$pdc = (Get-ADDomain).PDCEmulator$pdc
QYNET-CORE01.qy.net林根域的 PDC Emulator 是域时间层级的顶端。普通域成员按域层级同步时间,而 PDC 应配置可靠的外部时间源。
# 在 PDC 上检查时间源和状态w32tm /query /source
time.windows.com,0x9
w32tm /query /status
Leap Indicator: 0(no warning)Stratum: 3 (secondary reference - syncd by (S)NTP)Source: time.windows.com,0x9Last Successful Sync Time: 2026/9/21 10:31:42成员机或其他 DC 的时间源通常沿域层级指向 DC:
w32tm /query /source
QYNET-CORE01.qy.net查看域内时间拓扑:
w32tm /monitor /domain:qy.net
QYNET-CORE01.qy.net *** PDC *** [10.0.0.10]: ICMP: 1ms delay NTP: +0.0000000s offset from QYNET-CORE01.qy.netQYNET-CORE02.qy.net [10.0.0.11]: ICMP: 1ms delay NTP: +0.0156250s offset from QYNET-CORE01.qy.net上面的 IP、时间源和偏差用于说明输出格式。排查 Kerberos、登录和复制问题时,如果时间偏差接近或超过五分钟,应先处理时间同步,而不是直接重置账户或夺取 FSMO。
4.8 角色持有者离线时会发生什么
FSMO 持有者短时间离线,不意味着整个域立即停止工作。只要其他 DC、DNS、GC 和复制正常,现有用户通常仍能认证,但对应角色的特定操作会逐渐受影响。
| 离线角色 | 短期可能仍正常 | 持续离线后的影响 |
|---|---|---|
| Schema Master | 日常认证和普通对象修改 | 无法执行需要修改 Schema 的安装或升级 |
| Domain Naming Master | 用户和计算机登录 | 无法添加、删除域或某些目录分区 |
| PDC Emulator | 其他 DC 仍可处理多数认证 | 新密码验证、锁定、时间和部分管理操作异常 |
| RID Master | DC 使用本地 RID 池创建对象 | RID 池耗尽后无法创建用户、组或计算机 |
| Infrastructure Master | 单域环境通常不明显 | 多域对象引用无法及时更新 |
处理顺序:
- 确认是计划维护、临时网络故障,还是服务器永久损坏。
- 检查 DNS、RPC、LDAP、时间和复制。
- 原 DC 可以恢复时,优先恢复或正常转移角色。
- 只有确认原持有者不会再返回时,才考虑强制夺取。
- 夺取后清理旧 DC 元数据,旧角色持有者不能未经重建直接上线。
4.9 安全转移 FSMO 角色
计划维护或退役当前角色持有者时,应使用“转移”(Transfer),而不是“夺取”(Seize)。
先检查环境:
Get-ADDomainController -Filter * | Select-Object Name,HostName,Site,IsGlobalCatalog
repadmin /replsummarydcdiag /e /test:Connectivity /test:Replications使用 splatting 预演把五个角色转移到 QYNET-CORE02:
$moveParams = @{ Identity = "QYNET-CORE02" OperationMasterRole = @( "SchemaMaster" "DomainNamingMaster" "PDCEmulator" "RIDMaster" "InfrastructureMaster" ) WhatIf = $true}
Move-ADDirectoryServerOperationMasterRole @moveParams
What if: Performing the operation "Move directory server operation master role" on target "QYNET-CORE02".-WhatIf 只显示计划操作。正式执行前应确认变更窗口、复制健康、备份以及目标 DC 的 DNS、时间和网络状态。
正式转移时移除 WhatIf,并保留确认提示:
$moveParams.Remove("WhatIf")Move-ADDirectoryServerOperationMasterRole @moveParams
Move Operation Master RoleDo you want to move role 'PDCEmulator' to server 'QYNET-CORE02'?[Y] Yes [A] Yes to All [N] No [L] No to All [?] Help:转移后必须重新查询:
Get-ADForest | Select-Object SchemaMaster,DomainNamingMaster
Get-ADDomain | Select-Object PDCEmulator,RIDMaster,InfrastructureMaster
Get-ADDomainController -Identity QYNET-CORE02 | Select-Object Name,OperationMasterRoles使用 FQDN 直接作为 -Identity 如果出现解析问题,可以先取得 DC 对象:
$targetDC = Get-ADDomainController -Identity "QYNET-CORE02.qy.net"
$singleRole = @{ Identity = $targetDC OperationMasterRole = "PDCEmulator" WhatIf = $true}
Move-ADDirectoryServerOperationMasterRole @singleRole4.10 角色夺取为什么危险
只有当原 FSMO 持有者永久损坏、无法正常转移,而且确认不会再次回到环境中时,才考虑 -Force:
# 高风险示例:不要在原角色持有者仍可能恢复时执行$seizeParams = @{ Identity = "QYNET-CORE02" OperationMasterRole = @( "PDCEmulator" "RIDMaster" "InfrastructureMaster" "SchemaMaster" "DomainNamingMaster" ) Force = $true}
Move-ADDirectoryServerOperationMasterRole @seizeParams-Force 不是“跳过确认”参数。命令仍会先尝试正常转移,无法转移时才执行夺取。
夺取后必须注意:
- 原角色持有者不应直接重新接入环境。
- 应执行失效 DC 的元数据和 DNS 清理。
- 若要复用原服务器,通常应重建后再提升为 DC。
- 重新运行
netdom query fsmo、dcdiag和repadmin。 - PDC 被夺取后,立即检查新 PDC 的外部时间源。
- RID Master 被夺取后,关注 RID 池和安全主体创建。
⚠️ 原角色持有者能够通信时使用转移;只有确认它无法恢复且不会重新上线时才使用夺取。
4.11 常见场景与练习
场景一:所有 FSMO 都在同一台 DC
当前 qy.net 五个角色都在 QYNET-CORE01。这在单域、小型环境中并不罕见,也不代表配置错误。
需要确认:
- 是否还有第二台健康的可写 DC。
- DNS 是否同时部署在多台 DC。
- 是否有额外 GC。
- 两台 DC 的复制是否正常。
- 是否有经过验证的系统状态备份。
- 维护
QYNET-CORE01前是否评估 PDC 和 RID 等角色影响。
当前有 QYNET-CORE02,且两台 DC 都是 GC,具备基本冗余;但 FSMO 不会因为第一台 DC 关机而自动立即迁移。
场景二:用户刚改密码,却只能在部分设备登录
$pdc = (Get-ADDomain).PDCEmulator
Resolve-DnsName $pdcTest-NetConnection $pdc -Port 389repadmin /showrepl $pdc重点检查密码变化是否正常复制、登录失败的 DC 能否联系 PDC、客户端是否使用 AD DNS,以及客户端与 DC 的时间是否一致。不要仅因为密码异常就夺取 PDC;更常见的根因是复制、DNS、时间或网络。
场景三:准备关闭 QYNET-CORE01 维护
netdom query fsmo
Get-ADDomainController -Filter * | Select-Object Name,Site,IsGlobalCatalog,OperationMasterRoles
repadmin /replsummarydcdiag /e /test:Connectivity /test:Replications /test:FSMOCheck
w32tm /query /sourcew32tm /query /status短时间维护不一定需要移动全部 FSMO;如果维护时间较长,或涉及重装、降级域控、存储更换等高风险操作,应先正常转移到 QYNET-CORE02。
场景四:生成域控与 FSMO 巡检摘要
$domain = Get-ADDomain$forest = Get-ADForest$dcs = Get-ADDomainController -Filter *
[pscustomobject]@{ Domain = $domain.DNSRoot Forest = $forest.Name DomainMode = $domain.DomainMode ForestMode = $forest.ForestMode DomainControllerCount = $dcs.Count GlobalCatalogCount = @($dcs | Where-Object IsGlobalCatalog).Count PDCEmulator = $domain.PDCEmulator RIDMaster = $domain.RIDMaster InfrastructureMaster = $domain.InfrastructureMaster SchemaMaster = $forest.SchemaMaster DomainNamingMaster = $forest.DomainNamingMaster} | Format-List
Domain : qy.netForest : qy.netDomainMode : Windows2016DomainForestMode : Windows2016ForestDomainControllerCount : 2GlobalCatalogCount : 2PDCEmulator : QYNET-CORE01.qy.netRIDMaster : QYNET-CORE01.qy.netInfrastructureMaster : QYNET-CORE01.qy.netSchemaMaster : QYNET-CORE01.qy.netDomainNamingMaster : QYNET-CORE01.qy.net这个摘要可以快速回答:域里有几台 DC、GC 是否有冗余、五个 FSMO 在哪里。它不能替代复制、DNS、事件日志和备份检查。
4.12 本节排查顺序
Get-ADDomainController -Filter *:确认 DC、站点和 GC。Get-ADForest/Get-ADDomain:确认五个角色记录。Resolve-DnsName:确认角色持有者能够解析。Test-NetConnection:检查 LDAP、RPC、GC 等端口。repadmin /replsummary:确认复制健康。dcdiag /test:fsmocheck:确认角色定位和联系状态。- 根据故障性质决定恢复原 DC、正常转移,还是最后手段的角色夺取。
- 操作后再次查询角色、复制、DNS、时间和事件日志。
排查 FSMO 问题时,要区分三件事:AD 记录中的角色归属、角色持有者的网络可达性,以及角色相关服务是否真正健康。查询到角色名称只是第一步。
参考资料
- Flexible Single Master Operations roles in Active Directory Domain Services
- Transfer Flexible Single Master Operations roles
- Move-ADDirectoryServerOperationMasterRole
- Active Directory Domain Services functional levels
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













