AD 密码与组权限生效排查
AD 密码与组权限生效排查
AD 里的密码或组成员已经变了,用户的共享访问却可能保持原样。处理这类问题,先确定正在验证的是新认证、当前进程令牌,还是已经建立的 SMB 会话。它们不是同一个状态,刷新其中一个也不等于另外两个已经更新。
以下在 Windows Server 2022、Windows PowerShell 5.1 环境中比较两种变更:重置 u01 的密码,和给 kb13g1 增加授权组。域名为 corp.test.checo.cc,域控为 LAB-DC1,客户端为 LAB-MEMBER;分别观察目录、客户端和文件服务器的状态。
1. 状态与检查入口
| 状态 | 怎样取样 | 能回答什么 |
|---|---|---|
| 目录对象 | 固定 DC 查询账号、组成员 | 该 DC 当前保存了什么 |
| 客户端进程令牌 | 在目标会话中执行 whoami /groups | 这个进程实际持有哪些组 SID |
| Kerberos 缓存 | 同一登录会话的 klist | 当前缓存了哪些票据及其有效时间 |
| 服务端连接 | 文件服务器上的 Get-SmbSession、Get-SmbOpenFile | 哪些客户端上下文、文件句柄还在使用 |
| 资源权限 | 共享权限及 NTFS DACL | 正在访问的资源允许谁做什么 |
Windows 访问令牌记录用户及组 SID、权限等安全上下文;目录里的组成员变化不会直接改写一个现有进程的令牌。Access tokens
客户端交互令牌也不等于文件服务器为网络登录建立的上下文。新的网络认证可能获得更新后的组信息,而客户端原来的桌面令牌保持不变。因此“本地 whoami 还没变”是重要线索,却不能单凭它断言所有远程访问都只能等到整机注销才能更新。
2. 改密后的旧会话
10 月的记录先用 ADLAB\u01 建立 \\LAB-DC1\KB01 连接,并成功写入文件。随后在域控重置密码:
=== write 2 (before reset) ===
write2=OK
=== reset on LAB-DC1 19:00:53 ===
logon_old_pwd_rc=1326
logon_new_pwd_rc=0
=== write 3 via EXISTING session 19:01:07 ===
write3=OK新登录的旧密码失败码为 1326,新密码返回 0,说明新凭据校验已经改变;原连接仍能写入,说明密码验证和现有连接不能用同一条验收标准。
该用户会话的 LogonId 是 0:0x1bed571,缓存中有 TGT 与 cifs/LAB-DC1。记录中的票据 End Time 为 10 月 30 日 05:00:30,TGT Renew Time 为 11 月 5 日 19:00:30。这些是当次策略与签发时间下的读数,不是所有环境固定的寿命,也不是 SMB 会话的强制终止时刻。
清票据后,现有连接仍能继续写:
--- klist after purge ---
Cached Tickets: (0)
--- write 4 via EXISTING session after purge ---
write4=OK随后在文件服务器关闭该客户端的 SMB 会话,原映射下一次写入失败,net use 显示 Disconnected。这个前后对照支持的结论很具体:本次现有 SMB 会话不依赖客户端继续保留那张缓存票据。它不支持把所有 Kerberos 新请求、账户限制检查和其他服务都概括成“改密完全无效”。

本次 4624 的 AuthenticationPackageName 是 Kerberos,记录号 504946。判断协议应保留实际日志;不能仅凭访问地址是主机名或 IP 就替代协议确认。按 IP 使用 Kerberos 还涉及 SPN 与客户端配置。
3. 加组后的权限
11 月的实验用户 kb13g1 在控制台登录时还不属于 KB-T13-ScriptUsers。随后在域控加组并回读 memberOf,目录已包含目标组,原会话仍然不能访问 Z:。
| 取样时刻 | 操作/状态 | 当前会话含目标组 | 共享结果 |
|---|---|---|---|
| 12:34:09 | 加组前,缓存 7 张票据 | 否 | Access is denied |
| 加组后 | DC 回读成员关系已存在 | 否 | 仍拒绝 |
| 12:34:43 | purge 成功,缓存 7 → 0 | 否 | 仍拒绝 |
| 12:36:13 | 注销后重新控制台登录 | 是,SID 末段 4761 | 能列出 readme.txt |
这次记录没有在保留同一个桌面的前提下,单独拆掉全部相关网络上下文再重建的对照。因此可以确认“清缓存没有修复本次现有会话”,不能扩大成“purge 对任何远程组授权更新都没有用”。

重新登录后的票据数是 5,加组前是 7。数量不同并不构成故障或成功的判据;真正要看目标组 SID、对应服务票据、实际资源访问。远程桌面断开再连若回到原有会话,不等于注销,也不会因此自动换掉原来的桌面令牌。
4. 采集现场状态
在受影响用户的会话、AD 管理端和文件服务器分别取样:
# Run in the affected user's session, not an unrelated administrator shell.
whoami /user
whoami /groups
klist
Get-SmbConnection | Select-Object ServerName,ShareName,UserName,Dialect,NumOpens# Run on a management host with the AD module; use a confirmed DC.
$dc = 'LAB-DC1.corp.test.checo.cc'
Get-ADUser kb13g1 -Server $dc -Properties memberOf |
Select-Object SamAccountName,SID,memberOf
Get-ADGroup 'KB-T13-ScriptUsers' -Server $dc -Properties member |
Select-Object Name,SID,membermemberOf 只反映直接成员关系,还要考虑主组、组作用域、嵌套与跨域条件。最稳妥的比较对象是资源 ACL 中的准确组 SID。不要把 gpresult 的组列表当作一份独立、实时的 DC 目录查询;也不要在管理员自己的会话里执行 whoami 后,把结果当作受影响用户的令牌。
文件服务器同时检查两层权限:
Get-SmbShareAccess -Name KB01
(Get-Acl -LiteralPath 'C:\KB01').Access |
Select-Object IdentityReference,FileSystemRights,AccessControlType,IsInherited原密码实验的共享与 NTFS 都只给 u01 所需写权限,并保留管理员和 SYSTEM 管理权限。负对照 u02 使用正确密码完成新登录,返回码 0,但读和写都被拒。这排除了“只是所有账号都无法认证”的解释,也说明登录成功不能替代资源访问验收。不要为了复现而在已有业务目录上清空 ACL;请在专用测试目录进行这类对照。
5. 终止 SMB 会话
密码重置示例应交互输入新密码,避免把可用密码写进脚本:
$newPassword = Read-Host 'New account password' -AsSecureString
Set-ADAccountPassword -Identity u01 -Server 'LAB-DC1.corp.test.checo.cc' `
-Reset -NewPassword $newPassword
Remove-Variable newPassword如果处置目标还包括中止现有共享访问,需要单独处理对应文件服务器的连接。先看用户、客户端、打开文件,再选定一个 SessionId:
# On the file server: inspect first, then select one confirmed session.
Get-SmbSession | Select-Object SessionId,ClientComputerName,ClientUserName,NumOpens
$sessionId = [uint64](Read-Host 'Confirmed SMB SessionId')
$s = Get-SmbSession -SessionId $sessionId -ErrorAction Stop
$s | Format-List SessionId,ClientComputerName,ClientUserName,NumOpens
Get-SmbOpenFile -SessionId $sessionId |
Select-Object FileId,SessionId,Path,ClientUserName
# Closing can interrupt open files. Execute after reviewing the exact target.
Close-SmbSession -SessionId $sessionId -Confirm关闭会话可能打断尚未保存的文件操作。不要按同一个客户端 IP 关闭所有用户,也不要把客户端默认动作写成 net use * /delete /y。若仅重建这个共享,先确认其他映射与打开文件,按准确路径处理:
net use \\LAB-DC1\KB01 /delete
# Run in the target user's session only when clearing its cache is intended.
klist purgepurge 会影响这个登录会话的其他 Kerberos 使用,命令范围比单个共享大。1219 表示与同一服务器的凭据连接冲突,和旧密码新登录失败的 1326 要分开处理;只删一个映射也未必移除了同一服务器全部相关连接,先检查实际连接再决定范围。klist 命令范围
6. 访问验收
授予组权限后,在固定 DC 确认变更,再在目标资源需要的安全上下文中重试。若要求客户端交互进程也持有新组,保存工作后注销并重新登录,核对准确 SID;若仅重建网络访问,验证新的服务端登录上下文与实际读写,不要求原桌面令牌必须同步变化。
撤销访问时分别验证:旧密码的新认证失败、目标旧连接已终止、目标账号无法重新完成被撤销的资源操作。还要考虑其他文件服务器与应用各自保留的会话;关闭一台 SMB 服务器不能代表所有访问已经停止。不要把票据十小时这样的策略值当作现有连接自动退出的倒计时。
本次查询 4627 没有匹配事件,不能事后补造登录组证据。微软文档要求先启用 Audit Group Membership,并启用 Audit Logon 的成功审计;组列表过大时还可能分成多条。4627 审计条件
实验结束时只清理专用共享、测试文件与测试组成员关系,并保留变更前的 ACL、组成员快照。被关闭的会话不能原地“回滚”;恢复授权后,客户端需要重新建立连接。
