Windows AD Practice Day2

6923 字
35 分钟
Windows AD Practice Day2

这是 Windows AD 每日训练的第二天,复习组权限、最后登录属性和 RPC 1722,并重点检查 DNS、SPN、Kerberos 票据与域时间同步。

Day 2:权限、Kerberos 与时间同步#

今天的总体评价#

主卷共 12 题,后面还有对话加练。概念方向掌握度约为 55%~60%:能够较快判断问题属于组权限、RPC、SPN、Kerberos 或时间层面,但命令精度、概念边界和完整验证链仍需加强。部分“我的回答”为当时作答摘要,而非逐字转录。

范围掌握情况需要加强
组查询良好保持区分组对象、组成员和主体所属组
登录时间需要复习LastLogonDate 是转换属性;LastLogon 不复制
共享权限基础方向正确区分 SMB 会话、共享 ACL 与 NTFS ACL
RPC 1722有基础框架动态 RPC、服务、事件日志与修复后验证
DNS 与 SPN部分掌握SRV 完整名称、-F 全林范围、SPN 与账户映射
Kerberos初步理解TGT、服务票据、SPN、服务密钥与 ACL 的边界
登录会话需要复习LUID 不是 SID 或 GUID;票据缓存按会话隔离
域时间部分掌握只有林根域 PDC 默认对接外部时间源;时间不是由 GPO“下发”
综合排障明显不足建立“验证—定位—修复—清缓存—复测—日志确认”闭环

本日重点错题:Q2、Q3、Q4、Q9、Q10、Q11、Q12。

Q1:组对象、组成员与用户所属组#

**题目:**分别查询 QYNET-Admin 组对象、递归成员,以及 qianyue 所属的组。

我的回答:

Terminal window
Get-ADGroup QYNET-Admin
Get-ADGroupMember -Identity QYNET-Admin -Recursive
Get-ADPrincipalGroupMembership -Identity qianyue

批改:

回答正确。Get-ADGroup 的第一个位置参数就是 -Identity,因此第一条省略参数名仍然有效。

三条命令分别查询:

命令查询对象
Get-ADGroup组对象本身
Get-ADGroupMember组中有哪些成员
Get-ADPrincipalGroupMembership某个安全主体属于哪些组

若要检查组能否用于授权,应继续查看类别和作用域:

Terminal window
Get-ADGroup -Identity QYNET-Admin |
Select-Object Name,GroupCategory,GroupScope

Q2:三种最后登录时间#

**题目:**解释 LastLogonDate、lastLogonTimestamp 与 lastLogon 的来源、复制特性和用途;如何较准确地查询最后登录时间?

我的回答:

  • LastLogonDate 是最后登录日期。
  • LastLogonTimeStamp 是最后登录时间戳。
  • LastLogon 是最后登录时间。
  • LastLogon 最精确;查询所有 DC 是因为复制可能滞后,尤其要关注 PDC。

批改:需要纠正的地方

前半部分只是根据名称解释,没有说明真正的技术区别。查询所有 DC 也不是为了等待复制完成,而是因为 LastLogon 根本不会在 DC 之间复制;PDC 并不保存全域唯一、最完整的 LastLogon。

正确思路与答案:

属性本质是否复制用途
LastLogonDateAD 模块把 lastLogonTimestamp 转换成易读日期间接依赖可复制属性长期不活跃对象粗筛
LastLogonTimeStampAD 中的 lastLogonTimestamp 原始 FILETIME会复制,但更新有意延迟90 天、180 天不活跃粗筛
LastLogon当前 DC 记录的精确登录值不复制查询每台 DC 后取最大值
Terminal window
# 粗筛 90 天未登录用户
Search-ADAccount `
-AccountInactive `
-TimeSpan 90.00:00:00 `
-UsersOnly

查询一个用户在所有 DC 上的 LastLogon:

Terminal window
$user = "qianyue"
Get-ADDomainController -Filter * |
ForEach-Object {
$result = Get-ADUser `
-Identity $user `
-Server $_.HostName `
-Properties LastLogon
[pscustomobject]@{
DomainController = $_.HostName
LastLogon = if ($result.LastLogon -gt 0) {
[datetime]::FromFileTime($result.LastLogon)
}
}
} |
Sort-Object LastLogon -Descending

重点复习:LastLogonDate 不是一套更粗的独立登录记录,它只是 lastLogonTimestamp 的易读转换。

Q3:已经加入安全组,为什么仍然没有共享权限#

题目:qianyue 已加入 QYNET-File-Read,却仍无法访问共享。如何区分 AD 成员关系、当前令牌、票据、SMB 会话、共享 ACL 与 NTFS ACL?

我的回答:

当时写了:

Terminal window
Get-ADGroupMember -Identity QYNET-File-Read -Recursive
Get-ADPrincipalGroupMembership -Identity qianyue
whoami /all
whoami /groups
net use
klist
Get-SmbSession
Get-SmbOpenFile

批改:做得好的地方

  • 知道同时检查 AD 组成员关系和客户端登录令牌。
  • 知道旧的 SMB 连接和 Kerberos 票据可能继续保存原身份状态。
  • 知道问题不能只在 DC 上检查。

正确思路与答案:关键遗漏

Get-SmbSession 和 Get-SmbOpenFile 查询的是服务器上的 SMB 会话与打开文件,不是共享 ACL。

共享权限应在文件服务器上查询:

Terminal window
Get-SmbShareAccess -Name "Public"

NTFS ACL 应查询共享对应的本地目录:

Terminal window
Get-Acl "D:\Shares\Public" |
Select-Object -ExpandProperty Access

完整排查链:

Terminal window
# 1. AD 成员关系与组类型
Get-ADGroup -Identity QYNET-File-Read |
Select-Object Name,GroupCategory,GroupScope
Get-ADGroupMember -Identity QYNET-File-Read -Recursive |
Where-Object SamAccountName -eq "qianyue"
# 2. 当前登录令牌
whoami /groups | findstr /i "QYNET-File-Read"
# 3. 当前票据与旧连接
klist
net use
# 4. 在文件服务器上查询共享与 NTFS ACL
Get-SmbShareAccess -Name "Public"
Get-Acl "D:\Shares\Public" |
Select-Object -ExpandProperty Access

判断刷新方式:

  • SPN、服务账户或旧服务票据变化:修复根因后可以使用 klist purge 验证。
  • 用户登录后才被加入新组:klist purge 不会重建当前桌面登录令牌,最可靠的方法是注销并重新登录。
  • 已建立 SMB 连接:关闭文件后使用 net use \\server\share /delete,再重新连接。

重点复习:SMB 会话不是共享权限;共享 ACL 和 NTFS ACL 必须分别检查。

Q4:复制错误 1722#

**题目:**某 DC 复制错误 1722。如何解释 Ping、TCP 135 的测试结果,并按顺序检查 DNS、RPC、服务与复制详情?

我的回答:

当时提到了 Ping、名称解析、RpcEptMapper、TCP 135 和防火墙,并指出 Ping 失败不等于服务器关机。

批改:需要修正的地方

  1. Ping 使用 ICMP,不存在“Ping 的端口”。
  2. TCP 135 只负责 RPC Endpoint Mapper;实际 RPC 会话还会使用协商出的动态 TCP 端口。
  3. Get-NetFirewallRule -DisplayName "RPC" 是精确名称匹配,通常不能完整列出 RPC 相关规则。
  4. 动态 RPC 不是简单查一个名为 Dynamic 的防火墙规则。
  5. 缺少 repadmin /showrepl、DCDiag 和事件日志。

正确思路与答案:推荐顺序

Terminal window
# 1. 名称与地址
Resolve-DnsName QYNET-CORE02.qy.net
Resolve-DnsName 192.168.254.11 -Type PTR
nltest /dsgetdc:qy.net /force
# 2. ICMP 只作参考
Test-Connection QYNET-CORE02 -Count 2
# 3. 常见 AD 端口与 RPC Endpoint Mapper
Test-NetConnection QYNET-CORE02 -Port 53
Test-NetConnection QYNET-CORE02 -Port 88
Test-NetConnection QYNET-CORE02 -Port 135
Test-NetConnection QYNET-CORE02 -Port 389
Test-NetConnection QYNET-CORE02 -Port 445
# 4. 检查关键服务
Get-Service -ComputerName QYNET-CORE02 `
-Name RpcSs,RpcEptMapper,Netlogon,NTDS,KDC,DNS
# 5. 查看目标 DC 的入站复制详情
repadmin /showrepl QYNET-CORE02 /verbose
# 6. 验证连通性、DNS 和复制
dcdiag /s:QYNET-CORE02 /test:connectivity /v
dcdiag /s:QYNET-CORE02 /test:DNS /v
dcdiag /s:QYNET-CORE02 /test:replications /v
# 7. 修复后重新验证
repadmin /replsummary
repadmin /showrepl QYNET-CORE02

RPC 动态端口在现代 Windows Server 上通常位于高位 TCP 端口范围。TCP 135 成功只表示能联系 Endpoint Mapper,不能证明后续协商的动态端口一定畅通。

还应检查目标 DC 的 System、Directory Service、DNS Server 和 DFS Replication 日志。

重点复习:1722 是 RPC 通信链失败,不是“服务器关机”的同义词。

Q5:DNS、SRV 与 SPN#

**题目:**查询 Kerberos SRV 记录、全林 SPN 所有者与重复项,并为服务账户安全添加 SPN。

我的回答:

当时记得 setspn -Q、setspn -X 和 setspn -S 的主要作用;SRV 查询名称与全林范围没有写完整。

批改: SRV 名称未写完整,也漏了全林查询范围;setspn -Q、-X、-S 的方向已掌握。正确命令如下:

Terminal window
# 1. 查询 Kerberos KDC SRV 记录
Resolve-DnsName -Type SRV "_kerberos._tcp.qy.net"
# 也可以使用 Nslookup
nslookup -type=SRV _kerberos._tcp.qy.net
# 2. 在整个林中反向查询 SPN 所有者
setspn -F -Q HTTP/testweb.qy.net
# 3. 在整个林中检查重复 SPN
setspn -X -F
# 4. 安全添加 SPN
setspn -S HTTP/testweb.qy.net QY\svc_testweb

setspn -U 用来明确目标是用户账户,在已提供明确域用户名称时通常不是必需项。

-S 会先检查重复再添加;-A 直接写入,可能制造重复 SPN。重复 SPN 会使 KDC 无法唯一确定应该使用哪个账户密钥,导致票据申请失败或认证异常。

重点复习:SRV 查询必须包含服务和协议标签,例如 _kerberos._tcp.qy.net,不能只查询普通域名。

Q6:Kerberos 认证流程#

**题目:**按顺序说明 TGT、KDC、TGS、SPN、服务票据和目标资源 ACL 在 Kerberos 访问中的作用。

我的回答:

当时描述的大致顺序是:KDC 验证用户、TGT 用于继续申请票据、TGS 签发服务票据、SPN 标识目标服务。

批改:需要修正的地方

  • KDC 不是“服务票据本身”,而是运行在 DC 上的密钥分发服务。
  • SPN 不只是资源名称,而是把服务实例映射到 AD 安全主体。
  • 目标服务账户密钥不是交给用户的“访问钥匙”,而是服务端用于解密和验证服务票据的密钥。

正确思路与答案:完整流程

1. 用户登录,客户端向 KDC 的 AS 请求 TGT
↓
2. AS 验证用户,返回 TGT
↓
3. 客户端携带 TGT,并以目标 SPN 请求服务票据
↓
4. KDC 的 TGS 查找 SPN 所属账户,签发服务票据
↓
5. 客户端把服务票据交给目标服务
↓
6. 目标服务使用自身账户密钥解密并验证票据
↓
7. 服务根据用户身份、组信息与资源 ACL 决定是否授权

拿到 TGT 只证明用户可以继续向 KDC 申请服务票据。它不证明:

  • 目标 SPN 存在且属于正确账户。
  • 目标服务能够解密票据。
  • 服务在线并接受 Kerberos。
  • 共享权限和 NTFS ACL 已授权。

Q7:阅读 klist 结果#

**题目:**阅读 klist 输出:缓存为空说明什么?krbtgt 与 cifs 票据有何区别?klist get 成功能证明什么?

**我的回答:**新登录会话尚未使用 Kerberos 访问服务时,票据缓存可以为空;第二问用“服务端票据、客户端票据”区分两张票据。

**批改:**第一问正确;第二问应区分 TGT 与目标服务票据,而不是“服务端/客户端票据”:

Server 字段票据类型
krbtgt/QY.NETTGT,用于向 KDC 继续申请票据
cifs/QYNET-CORE01.qy.netCIFS 服务票据,用于访问目标 SMB/CIFS 服务

klist get 成功可以证明:

  1. 当前登录会话能够联系 KDC。
  2. 当前主体能够获得 TGT。
  3. KDC 能够把目标 SPN 唯一解析到一个主体并签发服务票据。
  4. 票据已经进入当前登录会话缓存。

它不能证明:

  1. SPN 一定注册在实际运行服务的正确账户上。
  2. 目标服务拥有匹配密钥并能解密票据。
  3. 应用实际使用了这张票据,而不是回退到 NTLM。
  4. 服务在线、业务正常或 ACL 已允许访问。

如果 KDC 能看到重复 SPN,通常会因为主体不唯一而拒绝签发;因此“成功签发后仍完全不能说明是否重复”不够准确。但 DC 复制不一致时,仍应结合 setspn -X -F 检查全林状态。

Q8:klist purge 的边界#

**题目:**用户刚加入安全组却仍无权限,klist purge 能刷新什么、不能刷新什么?应如何验证与重新登录?

我的回答:

它清的是 Kerberos 票据,不是登录令牌。必须注销,或者创建新的登录会话。

批改:

核心判断正确,但处理流程还应补全:

  1. 先确认 AD 中的新组成员关系已存在并已复制。
  2. 使用 whoami /groups 检查当前登录令牌。
  3. 如果令牌缺少新组,注销并重新登录。
  4. 关闭已打开文件,再清理旧 SMB 连接。
  5. 修复 SPN 或服务身份后,才使用 klist purge 排除旧票据。
  6. 重新连接资源并检查新票据和权限。
Terminal window
whoami /groups
klist
net use
net use \\QYNET-FS01\Public /delete
klist purge

klist purge 不会重建当前桌面会话的本地访问令牌,也不会自动保证所有应用重新建立连接。

Q9:票据属于哪一个会话#

**题目:**解释 klist 的票据属于哪个登录会话、0x3e7 和 LUID 的含义,并区分 LUID、SID 与 ObjectGUID。

我的回答:

  • 认为 0x3e7 通常是 SYSTEM 登录会话。
  • 认为票据缓存按登录会话隔离。
  • 对 LUID 与 SID、GUID 的区别不确定。

**批改:**知道票据缓存按会话隔离,也认出了 SYSTEM 常见的 0x3e7;需要把 LUID 与 SID、ObjectGUID 分开。

正确思路与答案:

klist sessions 用于列出本机登录会话,包括每个会话的 LUID、账户和认证类型。

LUID 是由本机 LSA 分配的 Locally Unique Identifier,用于在当前计算机、当前运行周期中标识一个登录会话。它不是:

  • 用户或组的 SID。
  • AD 对象的 ObjectGUID。
  • 全域或全林身份标识。
Terminal window
# 当前命令所在登录会话
klist
# 列出所有登录会话
klist sessions
# 查询 SYSTEM 会话
klist -li 0x3e7

普通 klist 只查看当前命令所属 LUID 的缓存。Windows 服务、SYSTEM、计划任务、远程管理和其他用户分别处在不同登录会话中,因此不会自动显示在当前缓存里。

klist purge -li 0x3e7 会清除计算机身份和 SYSTEM 服务使用的票据,可能影响 GPO、LDAP、SMB、服务认证和其他域操作。在 DC 上尤其不应随意执行,但也不是“一执行 DC 就必然爆炸”;应准确描述为高影响操作。

重点复习:LUID 标识本机登录会话,SID 标识安全主体,ObjectGUID 标识 AD 对象。

Q10:AD 域时间层级#

**题目:**说明 AD 域时间层级:哪个 PDC 应对接权威上游,其他 DC 与成员机通常如何同步?

我的回答:

当时提到了 PDC 与外部 NTP、其他 DC 和客户端之间的层级,也指出让所有成员机访问公网会增加安全和稳定性问题。

批改:两个关键错误

  1. 不是每个域的 PDC Emulator 都直接配置公网 NTP;默认只让林根域 PDC Emulator位于整林时间层级顶端并对接权威上游。
  2. 时间不是由 PDC 通过 GPO“下发”到其他计算机;GPO 可以配置 W32Time,但实际同步由 Windows Time 服务按照域层级和选择算法完成。
权威外部 NTP / 组织内部时钟
↓
林根域 PDC Emulator
↓
子域 PDC Emulator与其他合适的上级 DC
↓
其他域控制器
↓
成员服务器与客户端

普通成员默认使用 NT5DS,从域层级选择时间源。这样可以:

  • 保持全林时间一致。
  • 使用域内经过身份验证的时间同步。
  • 避免每台设备依赖公网与外部 DNS。
  • 避免形成混乱或循环的时间拓扑。

Q11:分析实验环境的时间状态#

**题目:**实验环境中的林根域 PDC 显示 Local CMOS Clock、Type: NT5DS 和 Stratum: 1。这些结果分别能、不能证明什么?配置前应检查什么?

我的回答:

当时识别出 Local CMOS Clock 与林根域 PDC,并提到配置前要检查 UDP 123、DNS 和已有配置。

批改:需要修正的地方

Type: NT5DS 不表示“NT5DS 的来源是本地 CMOS”。它表示 W32Time 正尝试从 AD 域层级选取时间源;由于该服务器本身就是林根域 PDC,层级上方没有其他域时间源,最终退回到本地硬件时钟。

Stratum: 1 也不能单独证明连接了外部硬件时钟。本机以 LOCL 作为 RefID 时,也可能把自己作为低层级时间源播发。应同时检查:

  • Source
  • ReferenceId / RefID
  • Last Successful Sync Time
  • /query /peers
  • Time-Service 事件日志

正确思路:配置前检查

Terminal window
Get-ADDomain | Select-Object DNSRoot,PDCEmulator
Get-ADForest | Select-Object RootDomain
w32tm /query /source
w32tm /query /status
w32tm /query /configuration
w32tm /query /peers
Resolve-DnsName ntp.aliyun.com
w32tm /stripchart /computer:ntp.aliyun.com /samples:5 /dataonly

当前实验 VM 无法解析 ntp.aliyun.com,所以正式配置前还需要先修复外部 DNS 解析,或使用组织内部可解析的权威时间源。

示例命令:

以下命令只作复习,本次训练没有在 VM 上执行:

Terminal window
w32tm /config `
/syncfromflags:manual `
/manualpeerlist:"ntp.aliyun.com,0x8" `
/reliable:yes `
/update
Restart-Service W32Time
w32tm /resync /rediscover
w32tm /query /source
w32tm /query /status
w32tm /query /peers
w32tm /query /configuration

原回答中分两行执行 net stop w32time 与 net start w32time 也能工作;在 PowerShell 笔记中使用 Restart-Service W32Time 更直观。还遗漏了重新同步与 /peers、/configuration 验证。

Q12:Web 服务从 Kerberos 回退到 NTLM#

**题目:**Web 服务从 Kerberos 回退到 NTLM。如何核对 DNS/KDC、SPN、服务身份、票据、时间、事件日志,并形成复测闭环?

我的回答:

当时提出 SPN 缺失、绑错账户或重复,以及浏览器配置和时间偏差等方向;写了三条检查命令。

**批改:**SPN、浏览器配置和时间偏差等方向正确,但原答只覆盖了部分检查命令,尚缺少从客户端到服务端的验证闭环。下面是完整排查链。

第一步:从实际客户端确认名称与 KDC#

Terminal window
Resolve-DnsName testweb.qy.net
Resolve-DnsName -Type SRV "_kerberos._tcp.qy.net"
nltest /dsgetdc:qy.net /KDC /force

目的:确认客户端访问名称正确,并能找到可用 KDC。Kerberos 请求的 SPN 与用户实际输入的主机名有关,不能只检查服务器本机名称。

第二步:主动请求目标服务票据#

Terminal window
klist get HTTP/testweb.qy.net

目的:区分“KDC 无法签发票据”和“已经签发,但应用没有使用或服务端无法验证”。

第三步:查询 SPN 的唯一所有者#

Terminal window
setspn -F -Q HTTP/testweb.qy.net
setspn -X -F
setspn -L QY\svc_testweb

预期:HTTP/testweb.qy.net 只注册在实际运行 IIS 应用程序池的账户上。

第四步:核对 IIS 实际运行身份#

Terminal window
Invoke-Command -ComputerName TESTWEB -ScriptBlock {
Import-Module WebAdministration
Get-ChildItem IIS:\AppPools |
Select-Object Name,
@{Name="IdentityType";Expression={$_.processModel.identityType}},
@{Name="UserName";Expression={$_.processModel.userName}}
}

目的:确认文档中写的 QY\svc_testweb 与服务器当前实际配置一致。SPN 在正确名字下但服务使用另一个账户时,服务仍无法解密票据。

同时检查 IIS 是否启用了 Windows Authentication、Negotiate 是否位于 NTLM 之前,以及浏览器是否允许对该站点执行集成 Windows 身份验证。浏览器配置确实可能造成回退,但应在 DNS、SPN 和服务身份核对后,用客户端与 KDC 日志证明,而不是只凭猜测。

第五步:检查时间与票据缓存#

Terminal window
w32tm /query /source
w32tm /query /status
klist

修复 DNS、SPN 或服务身份后,再清除当前测试会话的旧票据:

Terminal window
klist purge

关闭并重新打开浏览器,重新访问 FQDN。

第六步:检查 KDC 事件#

Terminal window
$startTime = (Get-Date).AddMinutes(-30)
Get-WinEvent -FilterHashtable @{
LogName = "Security"
Id = 4768,4769,4771,4776
StartTime = $startTime
} |
Where-Object Message -Match "qianyue|svc_testweb|HTTP/testweb.qy.net" |
Select-Object TimeCreated,Id,Message

重点:

  • 4768:TGT 请求。
  • 4769:Kerberos 服务票据请求。
  • 4771:预身份验证失败。
  • 4776:NTLM 凭据验证,可帮助确认仍在回退。

第七步:形成验证闭环#

Terminal window
klist | findstr /i "HTTP/testweb.qy.net"
klist get HTTP/testweb.qy.net

最终应同时证明:

  1. 客户端缓存出现目标 HTTP 服务票据。
  2. DC 记录成功的 4769。
  3. 不再为该访问路径持续产生 4776。
  4. Web 访问正常,服务端没有 KRB_AP_ERR_MODIFIED 或解密错误。
  5. SPN 在全林中唯一,并属于服务实际运行账户。

重点复习:Kerberos 回退排障不能停在 setspn -Q。必须把 DNS/KDC、票据签发、SPN 所有者、服务身份、客户端缓存和事件日志串成闭环。


重点订正:四类共性问题#

1. 根据名称猜属性含义#

LastLogonDate、LastLogonTimeStamp 和 LastLogon 的区别不在于“日期、时间戳、时间”三种显示形式,而在于属性来源、是否复制以及精度。

2. 把身份状态混成一层#

AD 组成员关系、Windows 登录令牌、Kerberos 票据、现有 SMB 会话和资源 ACL 是五种不同状态。更新其中一层,不代表其他层立即刷新。

3. 把一个成功测试当成完整证明#

例如 klist get 成功只证明 KDC 能为当前会话签发目标 SPN 的票据,不能证明服务端能够解密、应用正在使用该票据或 ACL 已经授权。

4. 排障流程缺少收尾验证#

不少答案能写出前几条检查命令,但没有写复制详情、事件日志、修复动作以及修复后的重复验证。实际工单必须形成闭环。


闭卷追练:从命令记忆到排障判断#

随后在聊天中连续练习了命令和故障判断。以下记录的是当时的作答与纠正,不是在 VM 上重新执行后的输出。常用命令已经能较快写出;剩下的主要问题是属性拼写、查询范围,以及把不同层面的状态混为一谈。

一、闭卷命令记录#

题目当时的作答结果与纠正
90 天未活动用户Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly | Select-Object Name, SamAccountName, LastLogonDate✅ 正确。只适合长期不活跃账户的粗筛,不能直接据此删除。
已禁用计算机Get-ADComputer -Filter 'Enable -eq $false' | Select-Object Name, DNSHostName, DistinguishedName△ 属性名是 Enabled,不是 Enable。
用户属于哪些组Get-ADPrincipalGroupMembership qianyue | Select-Object Name,GroupScope,GropCategory△ 命令选对了;字段应写 GroupCategory。qianyue 作为位置参数有效。
递归列出组成员Get-ADGroupMember -Identity 'QYNET-Admin' -Recursive | Select-Object Name, SamAccountName, ObjectClass✅ 正确。递归结果是展开后的成员,不是完整的嵌套组结构图。
查询用户额外属性Get-ADUser -Identity 'qianyue' -Properties Department, LastLogonDate | Select-Object Name, SamAccountName, Department, LastLogonDate✅ 正确:先用 -Properties 取值,再用 Select-Object 控制显示。
查已启用的 IT 用户Get-ADUser -Filter 'Enabled -eq $true -and Department -eq "it"' | Select-Object Name,SamAccountName,Department△ 筛选条件正确,但漏了 -Properties Department;否则选中的 Department 列可能为空。
列出所有 DC 与 GC 状态Get-ADDomainController | Select-Object Name, Site, IsGlobalCatalog△ 少了 -Filter *,不能把不带参数的调用当作“列出所有 DC”。
纯 PowerShell 查 FSMO回答“用 Get-ADForest 查两个、Get-ADDomain 查三个”✅ 归属正确;具体字段见下方命令。
查看某 DC 复制详情repadmin /showrepl DC01✅ 正确;需要更详细信息时加 /verbose。
DCDiag 先连通、后 DNSdcdiag /test:Connectivity,dcdiag /test:dns✅ 两条都正确,参数大小写无关。
查看时间源与状态w32tm /query /source,w32tm /query /status✅ 两条都正确。
按 SPN 反查所有者setspn -Q HTTP/testweb.qy.net✅ 正确。需要明确查整林时,再考虑 -F 范围。
安全添加 SPN选 -S,说明它会查重;没有写完整命令✅ 概念正确;完整写法:setspn -S HTTP/testweb.qy.net svc_testweb。
查重复 SPNsetspn -X✅ 正确;是否要扩展到全林取决于查询范围。
复制失败摘要,只看错误repadmin /replsummary /errorsonly✅ 正确。

命令口诀:-Filter 决定找哪些对象;-Properties 决定额外取回哪些属性;Select-Object 决定最终显示哪些列。属性名记不清时,可先把对象保存到变量,用 Get-Member -MemberType Properties 或 Format-List * 核对,不需要硬猜。

完整的 IT 部门筛选命令:

Terminal window
Get-ADUser -Filter 'Enabled -eq $true -and Department -eq "IT"' `
-Properties Department |
Select-Object Name, SamAccountName, Department

纯 PowerShell 查询五个 FSMO 角色:

Terminal window
Get-ADForest | Select-Object SchemaMaster, DomainNamingMaster
Get-ADDomain | Select-Object PDCEmulator, RIDMaster, InfrastructureMaster

二、概念与故障题记录#

场景当时的思路复盘要点
刚加组却访问共享被拒绝提出 SPN、Kerberos、ACL;用 setspn -Q、klist 排查△ 第一步漏了当前登录令牌。先核对 AD 成员关系、组是否为 Security,再在客户端用 whoami /groups;最后核对共享权限和 NTFS ACL。出现认证错误线索时才深入 SPN。
DC 的 IsGlobalCatalog=False不是故障;该 DC 仍可服务本域,不能提供 GC 的跨域搜索✅ 基本正确。多域林中还要考虑通用组成员关系和可用 GC。
FSMO 的五个角色林级:架构、域命名;域级:PDC、RID、基础结构✅ 全对。
在线 DC 正常退役选择 transfer✅ 正确。先验证目标 DC 与复制,再转移、核验角色、正常降级;不要直接删除 VM。
复制报 1722先查 DNS 解析与 IP 连通;随后想到 LDAP 和 SMB△ 1722 要优先想到 RPC:DNS → 网络 → TCP 135 → 动态 RPC 端口/防火墙/服务。LDAP 与 SMB 在对应故障中再查;Ping 通也不能证明 RPC 通。
根域 PDC 时间源是 Local CMOS Clock表示本机时钟;正式环境应对接权威 NTP✅ 方向正确。它表示当前使用本机时钟,不能仅凭名称断言硬件时钟正在可靠校准。
入组后 klist purge 仍无权限应注销或重启,让“Windows 凭据同步”△ 处理方向对,但原因是重新登录才能重建包含新组 SID 的访问令牌;不是“凭据同步”。通常注销重登即可,不必重启。
成员机比 DC 快 12 分钟怀疑 Kerberos 时间偏差;用 w32tm /query /source 查时间源✅ 正确。这里是票据验证的时间偏差,不等于密码错误。
用通讯组给文件夹授权指出应使用 Security,不是 Distribution✅ 正确。GroupCategory 必须核对。
组作用域与 AGDLP知道 DomainLocal 对本域资源授权、Global 组织本域用户;应用题开头一度写反,随后自行改正△ 固定链条:用户 → Global → DomainLocal → 资源权限。新员工只加入 Global,已有 ACL 不用修改。
replsummary 正常,但 DC02 暂时查不到 DC01 新建的用户不会立刻全林强制同步;注意多站点链路压力,业务紧急时需处理✅ 风险意识很好;仍应先核对对象、查询的 DC、分区、复制方向和站点链路,再决定是否做最小范围复制。

共享权限题可以用这一条链复述:

AD 组成员关系 → 当前登录令牌(whoami /groups)
→ 共享权限(Get-SmbShareAccess)
→ NTFS ACL(Get-Acl)

klist purge 只清 Kerberos 票据,不会重建当前桌面登录会话的访问令牌。登录后才加入新组时,先注销重登,再检查 whoami /groups。现有 SMB 连接也可能需要关闭并重连。

三、本次压轴:多站点复制不能“一键全推”#

repadmin /replsummary 没有失败,只说明当前摘要没有发现复制错误,不保证新对象已经到达每一台 DC。尤其多站点可能有复制计划与链路成本。不要因某台 DC 暂时查不到用户,就直接执行:

Terminal window
repadmin /syncall /AdeP

这里 /A 涉及所有命名上下文,/d 使用 DN 标识,/e 把范围扩展到跨站点,/P 使用推送方向。组合执行可能显著增加站点间流量,但不应机械地说“必然压满链路”。业务着急也应先定位,再选最小范围。

建议先明确对两台 DC 查询,而不是依赖当前默认 DC:

Terminal window
$newUserSam = "newuser" # 改成刚创建的用户登录名
Get-ADUser -Identity $newUserSam -Server DC01
Get-ADUser -Identity $newUserSam -Server DC02
repadmin /showrepl DC02

如果确认对象在 DC01,且需要让 DC02 立即取得 DC=qy,DC=net 分区的变化,再评估是否针对性复制:

Terminal window
# 目标 DC 在前,源 DC 在后
repadmin /replicate DC02 DC01 "DC=qy,DC=net"

重点复习:先定位对象和复制方向,再选最小范围;/syncall /AdeP 不是日常“刷新按钮”。

下次开场先闭卷复述的十三句话#

不看答案,尝试口述下面十三句话:

  1. LastLogonDate 是 lastLogonTimestamp 的易读转换。
  2. LastLogon 不复制,所以精确查询要遍历所有 DC 并取最大值。
  3. Get-SmbSession 不是共享 ACL;共享 ACL 使用 Get-SmbShareAccess。
  4. Ping 使用 ICMP,没有所谓“Ping 端口”。
  5. LUID 标识本机登录会话,不是 SID 或 ObjectGUID。
  6. klist get 成功不证明服务能解密票据或 ACL 已授权。
  7. 默认只有林根域 PDC Emulator 对接外部权威时间源。
  8. Kerberos 回退要检查 DNS、KDC、SPN、服务身份、票据与事件日志。
  9. -Filter 找对象,-Properties 取额外字段,Select-Object 控制输出。
  10. 刚加组却无权限:先查登录令牌,再查共享权限与 NTFS ACL。
  11. 1722:DNS → 网络 → RPC 135 → 动态 RPC 端口与服务。
  12. AGDLP:用户 → Global → DomainLocal → 资源权限。
  13. 多站点复制先选最小范围;/e 跨站点、/P 推送,不要无差别使用 /syncall /AdeP。

重要问题库:Windows AD 重要问题库

上一篇:Windows AD Practice Day1

下一篇:Windows AD Practice Day3

支持与分享

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

打赏
Windows AD Practice Day2
https://springtsuki.xucjno.com/posts/springtsuki/notes/windowsad/practice/923/
作者
SpringTsuki
发布于
2026-09-23
许可协议
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

文章目录