Windows AD PowerShell(四):域控与 FSMO

3244 字
16 分钟
Windows AD PowerShell(四):域控与 FSMO

这是 Windows AD PowerShell 学习记录的第四节,主要整理域控制器(Domain Controller,DC)、FSMO 角色、全局编录(Global Catalog,GC)和域林功能级别的查询与排查方法。

本节中的域控、站点、FSMO 持有者和功能级别均通过实验环境进行了只读核对;角色转移、角色夺取和功能级别提升等写操作没有实际执行。

四、域控与 FSMO#

4.1 查询域中的所有域控制器#

Terminal window
Get-ADDomainController -Filter * |
Sort-Object Name |
Select-Object Name,HostName,Site,IsGlobalCatalog,IsReadOnly,
OperatingSystem,OperatingSystemVersion
Name : QYNET-CORE01
HostName : QYNET-CORE01.qy.net
Site : QYNET-CORE
IsGlobalCatalog : True
IsReadOnly : False
OperatingSystem : Windows Server 2016 Datacenter Evaluation
OperatingSystemVersion : 10.0 (14393)
Name : QYNET-CORE02
HostName : QYNET-CORE02.qy.net
Site : QYNET-CORE
IsGlobalCatalog : True
IsReadOnly : False
OperatingSystem : Windows Server 2016 Datacenter Evaluation
OperatingSystemVersion : 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 在日常排障中尤其重要:

  1. 林根域的 PDC Emulator 是整个林时间层级的权威源。
  2. 用户刚修改密码后,其他 DC 验证失败时会优先询问 PDC。
  3. 账户锁定信息会优先发送给 PDC。
  4. 一些组策略和旧式管理工具会优先连接 PDC。

4.3 查询 FSMO 角色持有者#

Terminal window
netdom query fsmo
Schema master QYNET-CORE01.qy.net
Domain naming master QYNET-CORE01.qy.net
PDC QYNET-CORE01.qy.net
RID pool manager QYNET-CORE01.qy.net
Infrastructure master QYNET-CORE01.qy.net
The command completed successfully.

当前五个 FSMO 角色全部由 QYNET-CORE01 持有。这在单域、小型环境中很常见,但维护该 DC 前要特别关注角色影响。

纯 PowerShell 查询方式:

Terminal window
# 两个林级角色
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 当前持有的角色:

Terminal window
Get-ADDomainController -Filter * |
Sort-Object Name |
Select-Object Name,
@{Name="OperationMasterRoles";Expression={
$_.OperationMasterRoles -join ", "
}}
Name OperationMasterRoles
---- --------------------
QYNET-CORE01 PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMaster
QYNET-CORE02

QYNET-CORE02 后面为空不表示故障,只表示它当前不持有 FSMO,仍可处理普通认证、LDAP 查询和目录复制。

4.4 检查 FSMO 健康状态#

netdom query fsmo 只能说明角色记录指向谁,不能证明持有者当前可达或服务健康。

Terminal window
dcdiag /test:fsmocheck
Starting test: FsmoCheck
......................... QYNET-CORE01 passed test FsmoCheck

需要详细过程时增加 /v,也可以指定一台 DC:

Terminal window
dcdiag /test:fsmocheck /v
dcdiag /s:QYNET-CORE02 /test:fsmocheck

排障时应检查是否出现 Warning、Error、DsGetDcName 失败、DNS 解析失败、RPC 或复制错误。

Terminal window
$pdc = (Get-ADDomain).PDCEmulator
Resolve-DnsName $pdc
Test-NetConnection -ComputerName $pdc -Port 389
Test-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 查询全局编录服务器#

Terminal window
Get-ADDomainController -Filter * |
Sort-Object Name |
Select-Object Name,Site,IsGlobalCatalog
Name Site IsGlobalCatalog
---- ---- ---------------
QYNET-CORE01 QYNET-CORE True
QYNET-CORE02 QYNET-CORE True

只列出 GC:

Terminal window
Get-ADDomainController -Filter {
IsGlobalCatalog -eq $true
} |
Select-Object Name,HostName,Site
Name HostName Site
---- -------- ----
QYNET-CORE01 QYNET-CORE01.qy.net QYNET-CORE
QYNET-CORE02 QYNET-CORE02.qy.net QYNET-CORE

GC 常用于全林搜索、通用组成员身份、用户登录,以及 Exchange 等依赖全局编录的服务。

协议端口用途
LDAP389普通 LDAP 查询
LDAPS636TLS 加密的 LDAP
Global Catalog3268GC 查询
Global Catalog over TLS3269TLS 加密的 GC 查询
Terminal window
Test-NetConnection -ComputerName QYNET-CORE01.qy.net -Port 3268
ComputerName : QYNET-CORE01.qy.net
RemotePort : 3268
TcpTestSucceeded : True

💡 GC 与 FSMO 不是一回事:GC 可以部署在多台 DC 上;同一个 FSMO 角色在对应范围内只能有一个持有者。当前两台 DC 都是 GC,但只有 QYNET-CORE01 持有 FSMO。

在多域林中,传统建议是不要让 Infrastructure Master 与 GC 位于同一台 DC。不过,如果林中只有一个域,或者该域全部 DC 都是 GC,这个限制通常不构成问题。当前 qy.net 是单域,且两台 DC 都是 GC,因此该布局合理。

4.6 查询域和林功能级别#

Terminal window
Get-ADDomain |
Select-Object DomainMode,Forest
DomainMode Forest
---------- ------
Windows2016Domain qy.net
Get-ADForest |
Select-Object ForestMode
ForestMode
----------
Windows2016Forest

一次整理域林状态:

Terminal window
$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.net
DomainMode : Windows2016Domain
Forest : qy.net
ForestMode : Windows2016Forest
DomainControllers : 2

功能级别决定 AD DS 可使用的功能,并限制能够作为 DC 加入环境的 Windows Server 版本;它不会限制普通成员服务器或客户端操作系统。

⚠️ DC 操作系统版本不等于功能级别。Windows Server 2019 和 Windows Server 2022 仍可运行在 Windows Server 2016 功能级别的林中。提升功能级别前,应确认全部 DC 版本、SYSVOL 复制方式、复制健康和备份。

以下命令仅用于预演:

Terminal window
Set-ADDomainMode -Identity "qy.net" -DomainMode Windows2016Domain -WhatIf
Set-ADForestMode -Identity "qy.net" -ForestMode Windows2016Forest -WhatIf

当前环境已经是 Windows Server 2016 域和林功能级别,不需要重复提升。

4.7 PDC Emulator 与时间同步#

Terminal window
$pdc = (Get-ADDomain).PDCEmulator
$pdc
QYNET-CORE01.qy.net

林根域的 PDC Emulator 是域时间层级的顶端。普通域成员按域层级同步时间,而 PDC 应配置可靠的外部时间源。

Terminal window
# 在 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,0x9
Last Successful Sync Time: 2026/9/21 10:31:42

成员机或其他 DC 的时间源通常沿域层级指向 DC:

Terminal window
w32tm /query /source
QYNET-CORE01.qy.net

查看域内时间拓扑:

Terminal window
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.net
QYNET-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 MasterDC 使用本地 RID 池创建对象RID 池耗尽后无法创建用户、组或计算机
Infrastructure Master单域环境通常不明显多域对象引用无法及时更新

处理顺序:

  1. 确认是计划维护、临时网络故障,还是服务器永久损坏。
  2. 检查 DNS、RPC、LDAP、时间和复制。
  3. 原 DC 可以恢复时,优先恢复或正常转移角色。
  4. 只有确认原持有者不会再返回时,才考虑强制夺取。
  5. 夺取后清理旧 DC 元数据,旧角色持有者不能未经重建直接上线。

4.9 安全转移 FSMO 角色#

计划维护或退役当前角色持有者时,应使用“转移”(Transfer),而不是“夺取”(Seize)。

先检查环境:

Terminal window
Get-ADDomainController -Filter * |
Select-Object Name,HostName,Site,IsGlobalCatalog
repadmin /replsummary
dcdiag /e /test:Connectivity /test:Replications

使用 splatting 预演把五个角色转移到 QYNET-CORE02:

Terminal window
$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,并保留确认提示:

Terminal window
$moveParams.Remove("WhatIf")
Move-ADDirectoryServerOperationMasterRole @moveParams
Move Operation Master Role
Do you want to move role 'PDCEmulator' to server 'QYNET-CORE02'?
[Y] Yes [A] Yes to All [N] No [L] No to All [?] Help:

转移后必须重新查询:

Terminal window
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 对象:

Terminal window
$targetDC = Get-ADDomainController -Identity "QYNET-CORE02.qy.net"
$singleRole = @{
Identity = $targetDC
OperationMasterRole = "PDCEmulator"
WhatIf = $true
}
Move-ADDirectoryServerOperationMasterRole @singleRole

4.10 角色夺取为什么危险#

只有当原 FSMO 持有者永久损坏、无法正常转移,而且确认不会再次回到环境中时,才考虑 -Force:

Terminal window
# 高风险示例:不要在原角色持有者仍可能恢复时执行
$seizeParams = @{
Identity = "QYNET-CORE02"
OperationMasterRole = @(
"PDCEmulator"
"RIDMaster"
"InfrastructureMaster"
"SchemaMaster"
"DomainNamingMaster"
)
Force = $true
}
Move-ADDirectoryServerOperationMasterRole @seizeParams

-Force 不是“跳过确认”参数。命令仍会先尝试正常转移,无法转移时才执行夺取。

夺取后必须注意:

  1. 原角色持有者不应直接重新接入环境。
  2. 应执行失效 DC 的元数据和 DNS 清理。
  3. 若要复用原服务器,通常应重建后再提升为 DC。
  4. 重新运行 netdom query fsmo、dcdiag 和 repadmin。
  5. PDC 被夺取后,立即检查新 PDC 的外部时间源。
  6. 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 关机而自动立即迁移。

场景二:用户刚改密码,却只能在部分设备登录#

Terminal window
$pdc = (Get-ADDomain).PDCEmulator
Resolve-DnsName $pdc
Test-NetConnection $pdc -Port 389
repadmin /showrepl $pdc

重点检查密码变化是否正常复制、登录失败的 DC 能否联系 PDC、客户端是否使用 AD DNS,以及客户端与 DC 的时间是否一致。不要仅因为密码异常就夺取 PDC;更常见的根因是复制、DNS、时间或网络。

场景三:准备关闭 QYNET-CORE01 维护#

Terminal window
netdom query fsmo
Get-ADDomainController -Filter * |
Select-Object Name,Site,IsGlobalCatalog,OperationMasterRoles
repadmin /replsummary
dcdiag /e /test:Connectivity /test:Replications /test:FSMOCheck
w32tm /query /source
w32tm /query /status

短时间维护不一定需要移动全部 FSMO;如果维护时间较长,或涉及重装、降级域控、存储更换等高风险操作,应先正常转移到 QYNET-CORE02。

场景四:生成域控与 FSMO 巡检摘要#

Terminal window
$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.net
Forest : qy.net
DomainMode : Windows2016Domain
ForestMode : Windows2016Forest
DomainControllerCount : 2
GlobalCatalogCount : 2
PDCEmulator : QYNET-CORE01.qy.net
RIDMaster : QYNET-CORE01.qy.net
InfrastructureMaster : QYNET-CORE01.qy.net
SchemaMaster : QYNET-CORE01.qy.net
DomainNamingMaster : QYNET-CORE01.qy.net

这个摘要可以快速回答:域里有几台 DC、GC 是否有冗余、五个 FSMO 在哪里。它不能替代复制、DNS、事件日志和备份检查。

4.12 本节排查顺序#

  1. Get-ADDomainController -Filter *:确认 DC、站点和 GC。
  2. Get-ADForest / Get-ADDomain:确认五个角色记录。
  3. Resolve-DnsName:确认角色持有者能够解析。
  4. Test-NetConnection:检查 LDAP、RPC、GC 等端口。
  5. repadmin /replsummary:确认复制健康。
  6. dcdiag /test:fsmocheck:确认角色定位和联系状态。
  7. 根据故障性质决定恢复原 DC、正常转移,还是最后手段的角色夺取。
  8. 操作后再次查询角色、复制、DNS、时间和事件日志。

排查 FSMO 问题时,要区分三件事:AD 记录中的角色归属、角色持有者的网络可达性,以及角色相关服务是否真正健康。查询到角色名称只是第一步。

参考资料#


上一篇:Windows AD PowerShell(三):计算机

下一篇:Windows AD PowerShell(五):复制健康与 Repadmin

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Windows AD PowerShell(四):域控与 FSMO
https://springtsuki.xucjno.com/posts/springtsuki/notes/windowsad/powershell/921-fsmo/
作者
SpringTsuki
发布于
2026-09-21
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
SpringTsuki
你好,我是浅月。
公告
浅月的开发小窝!欢迎你来到这里!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
56
分类
9
标签
42
总字数
188,888
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录