Windows AD Powershell

3454 字
17 分钟
Windows AD Powershell

AD 运维 PowerShell 常用命令集合#

按场景分类,每个命令都标注了”什么时候用”。

和 Windows AD 巡检 的区别:那篇讲怎么巡检,这篇是命令速查。配合使用。

阅读指引#

这份集合按场景分类,三种用法:

你的情况从哪开始
正在排障直接跳到最后的 数字口诀,按顺序查
想系统学从 第一节 往下看
只查某个命令Ctrl+F 搜关键词

目录#


一、用户与账户#

查用户#

Terminal window
# 查单个用户的基本信息
Get-ADUser -Identity qianyue -Properties *
# 查所有启用的用户
Get-ADUser -Filter 'Enabled -eq $true'
# 按名字模糊查
Get-ADUser -Filter 'Name -like "*浅月*"'
# 查某个 OU 下的所有用户
Get-ADUser -SearchBase "OU=User,OU=Admin,OU=Organization,DC=qy,DC=net" -Filter *
# 查密码永不过期的用户
Get-ADUser -Filter 'userAccountControl -band 0x10000' -Properties userAccountControl
# 查长期未登录的用户(90 天)
$days = (Get-Date).AddDays(-90)
Get-ADUser -Filter * -Properties LastLogonTimeStamp |
Where-Object { $_.LastLogonTimeStamp -lt $days.ToFileTime() -and $_.Enabled -eq $true } |
Select Name, SamAccountName, @{N='LastLogon';E={[datetime]::FromFileTime($_.LastLogonTimeStamp)}}
# 查锁定中的账户
Search-ADAccount -LockedOut
# 查密码已过期的账户
Search-ADAccount -PasswordExpired
# 查已禁用的账户
Search-ADAccount -AccountDisabled

改用户#

Terminal window
# 启用/禁用账户
Enable-ADAccount -Identity qianyue
Disable-ADAccount -Identity qianyue
# 解锁账户
Unlock-ADAccount -Identity qianyue
# 重置密码
Set-ADAccountPassword -Identity qianyue -NewPassword (ConvertTo-SecureString "P@ssw0rd123" -AsPlainText -Force)
# 取消密码永不过期
Set-ADUser -Identity qianyue -PasswordNeverExpires $false
# 强制下次登录改密码
Set-ADUser -Identity qianyue -ChangePasswordAtLogon $true
# 移动用户到另一个 OU
Move-ADObject -Identity "CN=浅月,OU=User,DC=qy,DC=net" -TargetPath "OU=NewOU,DC=qy,DC=net"

⚠️ 重置密码后”用户说登不上”的常见原因:只改了密码、没解锁账户,或没考虑”下次登录须更改密码”。 排查时先 Search-ADAccount -LockedOut 看一眼,比翻事件日志快。


二、组与成员#

Terminal window
# 查组
Get-ADGroup -Filter *
# 查某个组的成员
Get-ADGroupMember -Identity "Domain Admins"
# 查某个用户属于哪些组
Get-ADPrincipalGroupMembership -Identity qianyue
# 加人进组
Add-ADGroupMember -Identity "Domain Admins" -Members qianyue
# 从组里移除
Remove-ADGroupMember -Identity "Domain Admins" -Members qianyue
# 查空组
Get-ADGroup -Filter * -Properties Members | Where-Object { $_.Members.Count -eq 0 }
# 查组的作用域与类型(排查权限问题常看)
Get-ADGroup -Identity "Domain Admins" -Properties GroupScope, GroupCategory

💡 GroupScope / GroupCategory 是权限排查的高频字段:

字段取值说明
GroupScopeDomainLocal本域内授权(可含外域成员)
Global跨域授权(只能含本域成员)
Universal全林授权(存于 GC)
GroupCategorySecurity安全组(能授权)
Distribution通讯组(不能授权,只能发邮件)

“我明明加进组了怎么没权限” 常见原因之一:加进的是通讯组(Distribution), 它根本不参与 ACL 判定。

💡 GroupScope 转换有约束:Global → Universal 需要该组不是其他全局组的成员; 且林功能级别低于 2003 时无法创建 Universal 组。转换失败先查这个。

💡 递归查组成员:Get-ADGroupMember 只返回直接成员,遇到嵌套组要加 -Recursive:

Terminal window
Get-ADGroupMember -Identity "Domain Admins" -Recursive

排查”这个人明明在组里为什么没权限”时,嵌套组是重灾区。


三、计算机#

Terminal window
# 查所有计算机
Get-ADComputer -Filter *
# 查某台计算机的详细信息
Get-ADComputer -Identity QYNET-CORE01 -Properties *
# 查长期未登录的计算机(90 天)
$days = (Get-Date).AddDays(-90)
Get-ADComputer -Filter * -Properties LastLogonTimeStamp |
Where-Object { $_.LastLogonTimeStamp -lt $days.ToFileTime() } |
Select Name, @{N='LastLogon';E={[datetime]::FromFileTime($_.LastLogonTimeStamp)}}
# 查操作系统分布
Get-ADComputer -Filter * -Properties OperatingSystem |
Group-Object OperatingSystem | Sort-Object Count -Descending

⚠️ LastLogonTimeStamp 的坑:这个属性不是实时同步的,默认每 9~14 天才复制一次。 所以它适合做”长期未登录”的粗筛(比如 90 天),不能用来判断”这台机今天有没有登录”。 要精确值只能逐台查 LastLogon(不复制,各 DC 独立),代价很高。


四、域控与 FSMO#

Terminal window
# 列出所有 DC
Get-ADDomainController -Filter *
# 查 FSMO 角色持有者
netdom query fsmo
# 查 FSMO 健康(当前 DC 能否联系所有角色持有者)
dcdiag /test:fsmocheck
# 查 GC 覆盖
Get-ADDomainController -Filter * | Select Name, Site, IsGlobalCatalog
# 查域功能级别
Get-ADDomain | Select DomainMode, Forest
Get-ADForest | Select ForestMode

💡 纯 PowerShell 查 FSMO(不依赖 netdom,适合 Server Core / 无 RSAT 环境):

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

5 个角色:Schema Master、Domain Naming Master(林级)+ PDC Emulator、RID Master、Infrastructure Master(域级)。


五、复制健康#

Terminal window
# 复制摘要(最常用)
repadmin /replsummary
# 只看失败的
repadmin /replsummary /errorsonly
# 按失败率排序
repadmin /replsummary /sort:percent
# 查某台 DC 的复制详情
repadmin /showrepl QYNET-CORE01
# 详细模式,带错误码
repadmin /showrepl QYNET-CORE01 /verbose
# 导出 CSV
repadmin /showrepl * /csv > repl.csv
# 强制复制
repadmin /replicate DC01 DC02 "DC=qy,DC=net"
# 强制同步所有分区
repadmin /syncall /AdeP

⚠️ repadmin /syncall /AdeP 参数含义(别背错):

参数含义
/A所有命名上下文(All)
/d按 DN 标识(distinguished name)
/e企业级,跨站点(Enterprise)
/P推模式(Push),从当前 DC 推出去

⚠️ /e 参数要评估后再用:它会让复制跨站点传播,短时间内可能压满站点间链路。 单站点环境无影响,多站点环境要评估——尤其是链路带宽紧张或站点数多的情况。 只想同步本站点内,去掉 /e 即可。


六、dcdiag 健康检查#

Terminal window
# 全林全项检查,只报错
dcdiag /e /q /c
# 只测复制
dcdiag /test:replications
# 只测连通性
dcdiag /test:connectivity
# 只测 DNS
dcdiag /test:DNS /v
# 只测 SYSVOL
dcdiag /test:sysvolcheck /test:advertising
# 只测 FSMO
dcdiag /test:fsmocheck

💡 排障时的顺序:先 /test:connectivity 确认能通,再 /test:DNS,最后才看具体服务测试。 DNS 挂了,后面所有测试都会失败——先看 DNS 能省掉一大半迷惑性的报错。


七、DNS 与 SPN#

Terminal window
# 查 SRV 记录
nslookup -type=SRV _ldap._tcp.qy.net
nslookup -type=SRV _kerberos._tcp.qy.net
nslookup -type=SRV _gc._tcp.qy.net
# 查某账户注册了哪些 SPN
setspn -L QYNET-CORE01
# 反向查某个 SPN 被谁注册
setspn -Q HTTP/testweb.qy.net
# 全林查重复 SPN
setspn -X
# 安全添加 SPN
setspn -S HTTP/testweb.qy.net svc_testweb
# 删除 SPN
setspn -D HTTP/testweb.qy.net svc_testweb

💡 为什么强调 setspn -S 而不是 -A: -S(Add,带检查)会先查重再添加,重复就报错;-A(Add)会直接写进去,制造重复 SPN。 重复 SPN 会导致 Kerberos 认证随机失败(票据请求指向错误的账户),且极难排查。永远用 -S。

💡 Kerberos 认证失败的经典三连(服务账号场景的完整排查链):

  1. SRV 记录在不在 —— nslookup -type=SRV _kerberos._tcp.<域>
  2. SPN 挂在正确的账户上没 —— setspn -L <服务账户>
  3. 有没有重复 SPN —— setspn -X
  4. 客户端拿到票据没 —— klist
  5. KDC 报什么错 —— 事件日志看 4771 / 4768

这五步能覆盖绝大部分”服务账号认证失败”的工单。


八、Kerberos 与票据#

Terminal window
# 看当前票据
klist
# 清空票据,强制重新获取
klist purge
# 看票据详情
klist -e

💡 klist purge 是万能第一步:改过权限、加过组、改过 SPN 之后,客户端往往还拿着旧票据。 让用户 klist purge 或直接注销重登,比在服务端查半天快得多。


九、时间同步#

Terminal window
# 查时间源
w32tm /query /source
# 查时间状态
w32tm /query /status
# 强制同步
w32tm /resync /force
# 查与时间源的偏差
w32tm /stripchart /computer:ntp.aliyun.com /samples:5
# 配置外网 NTP
w32tm /config /syncfromflags:manual /manualpeerlist:"ntp.aliyun.com,0x8" /reliable:yes /update
net stop w32time && net start w32time

⚠️ 时间偏差 > 5 分钟会导致 Kerberos 直接拒绝认证(默认 MaxClockSkew)。 遇到”昨天还好好的,今天所有人都登不上域”,先查时间,别急着查复制。

💡 域内时间层次:PDC Emulator 应对接外部 NTP,其他 DC 从 PDC 同步,成员机从任意 DC 同步。 所以配外网 NTP 只需要在 PDC 上做。


十、事件日志#

Terminal window
# 查账户锁定事件(4740)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 20
# 查登录失败(4625)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 20
# 查目录服务日志里的错误
Get-WinEvent -LogName 'Directory Service' -MaxEvents 50 |
Where-Object { $_.LevelDisplayName -eq 'Error' }
# 查 DFSR 日志
Get-WinEvent -LogName 'DFS Replication' -MaxEvents 50 |
Where-Object { $_.LevelDisplayName -in @('Error','Warning') }

💡 4740 里找”是谁锁的”:事件里的 Caller Computer Name 字段就是锁定来源机器。 如果同一个账户反复被锁,通常是某台机器上存着旧密码(计划任务、服务、映射盘、手机邮件客户端)。 按 Caller Computer Name 定位到机器,再清掉那里的凭据即可。

常用事件 ID 速查

ID含义
4624登录成功
4625登录失败
4648使用显式凭据登录(排查横向移动)
4662对目录对象的操作(审计用)
4720 / 4726创建 / 删除用户
4728 / 4729加入 / 移出全局组
4732 / 4733加入 / 移出本地组
4740账户被锁定
4767账户被解锁
4768请求 Kerberos TGT
4771Kerberos 预认证失败(密码错 / 时间偏差 / 账户禁用)
4776NTLM 凭据验证失败
5136目录对象被修改

💡 4625 和 4771 的区别:域环境里 Kerberos 是首选,所以密码错通常报 4771; 只有回退到 NTLM 时才报 4776。查”密码错误导致锁定”要先看 4771 而不是 4625。

💡 4648 是横向移动的强信号:正常用户极少触发(除非 runas)。 短时间内大量 4648 出现在非管理机上,值得追查。

💡 4771 的三个子状态码(在事件详情里看):

失败代码含义
0x18密码错误
0x12账户被禁用 / 锁定 / 过期
0x25时钟偏差过大 ← 时间同步没做好就是它

所以 4771 出现 0x25,直接去查 w32tm,别再查密码了。


十一、备份与恢复#

Terminal window
# 查可用备份
wbadmin get versions
# 查备份配置
wbadmin get status
# 系统状态备份
wbadmin start systemstatebackup -backupTarget:E:
# 系统状态还原(在 DSRM 里跑)
wbadmin start systemstaterecovery -version:<版本标识符>

⚠️ 系统状态还原必须在 DSRM(目录服务还原模式)下执行,正常模式跑会失败。

AD 回收站(Recycle Bin)—— 优先用它,而不是整机还原#

开启回收站后,大多数误删对象可以直接恢复,不需要进 DSRM、不需要停机。

前置条件:

  • 林功能级别 Windows Server 2008 R2 以上
  • 需要 Enterprise Admins 或 Domain Admins 权限
  • ⚠️ 开启后不可关闭(官方明确说明)
  • 开启瞬间会导致全林复制一次,建议在低峰期做
Terminal window
# 查是否已开启
Get-ADOptionalFeature -Filter 'Name -like "Recycle Bin Feature"'
# 开启(不可逆)
Enable-ADOptionalFeature -Identity "Recycle Bin Feature" -Scope ForestOrConfigurationSet -Target "qy.net"
# 查已删除对象
Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects -Properties *
# 恢复
Restore-ADObject -Identity "<对象的 DN 或 GUID>"

💡 保留期与”墓碑”:回收站对象的保留期由 msDS-DeletedObjectLifetime 控制(默认继承 tombstoneLifetime,通常 180 天)。超过保留期就真的没了,只能靠备份还原。

Terminal window
Get-ADObject "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=qy,DC=net" `
-Properties msDS-DeletedObjectLifetime, tombstoneLifetime

⚠️ 恢复用户前先想清楚:Restore-ADObject 恢复的是删除那一刻的对象, 但该用户的组成员关系、ACL 授权不会自动回到删除前状态(需要额外处理)。 恢复后记得核对组归属。


十二、磁盘与性能#

Terminal window
# 查磁盘空间
Get-PSDrive C | Select Used, Free
# 查 NTDS.dit 大小
Get-Item "C:\Windows\NTDS\ntds.dit" | Select Length
# LDAP 性能计数器
Get-Counter "\NTDS\LDAP Searches/sec" -SampleInterval 1 -MaxSamples 5
Get-Counter "\NTDS\DRA Pending Replication Synchronizations"
# 查 RPC 动态端口
netstat -an | findstr 49152

💡 NTDS.dit 会随删除操作持续膨胀,删除用户不会让它变小。 要真正回收空间必须做离线碎片整理(ntdsutil → activate instance ntds → compact to), 期间 AD 服务中断,需停机窗口。

💡 DRA Pending Replication Synchronizations 持续不降 = 复制积压, 配合 repadmin /replsummary 一起看。


十三、站点与服务#

Terminal window
# 查所有站点
Get-ADReplicationSite -Filter *
# 查站点链接
Get-ADReplicationSiteLink -Filter *
# 查子网
Get-ADReplicationSubnet -Filter *
# 查某台 DC 的复制连接
Get-ADReplicationConnection -Filter *

💡 子网没定义会导致客户端”就近登录”失效——客户端会随机选 DC, 表现为”登录慢""跨站点流量异常”。排查时先确认客户端 IP 所在子网已在 AD 站点中定义。


十四、清理与维护#

Terminal window
# 查孤立的 SID(账户被删但权限还在)
# 没有直接命令,需要结合 ACL 工具
# 查空 OU
Get-ADOrganizationalUnit -Filter * -Properties Children |
Where-Object { $_.Children.Count -eq 0 }
# 查重复的 sAMAccountName(AD 本身不允许,但历史遗留可能有)
Get-ADUser -Filter * | Group-Object SamAccountName |
Where-Object { $_.Count -gt 1 }

💡 补充:查孤立 SID 的可行做法——用 Get-Acl 遍历目标资源, 检查 IdentityReference 是否为 S-1-5-21-... 形式的裸 SID(说明对应账户已删):

Terminal window
Get-ChildItem "D:\Share" -Recurse |
Get-Acl |
ForEach-Object { $_.Access } |
Where-Object { $_.IdentityReference -like 'S-1-5-21-*' } |
Select IdentityReference, FileSystemRights -Unique

十五、GPO 相关#

Terminal window
# 查所有 GPO
Get-GPO -All
# 查某个 GPO 的详细信息
Get-GPO -Name "Default Domain Policy"
# 查 GPO 链接关系
Get-GPInheritance -Target "OU=User,OU=Admin,OU=Organization,DC=qy,DC=net"
# 导出 GPO 报告
Get-GPOReport -Name "Default Domain Policy" -ReportType Html -Path C:\gpo.html
# 备份所有 GPO
Backup-GPO -All -Path C:\GPOBackup

⚠️ 改 GPO 前先备份:Backup-GPO -All -Path C:\GPOBackup 只要几秒, 但改错了回滚可能就是几小时。

💡 查”某台机器为什么没生效”:

Terminal window
gpresult /h C:\gpresult.html # 在目标机器上跑,出 HTML 报告

报告里有 “应用的 GPO”和”被拒绝的 GPO” 两块,能直接看出是没链接、被 WMI 筛选挡住、还是被安全筛选挡住。


附:数字口诀(排障顺序)#

AD 出问题时按这个顺序查,能覆盖大部分场景:

口诀含义
1. 时间偏差 > 5 分钟,Kerberos 直接失败 → w32tm /query /source
2. DNSDNS 挂了所有测试都失败 → nslookup -type=SRV _ldap._tcp.<域>
3. 连通端口通不通 → dcdiag /test:connectivity
4. 复制数据一致不一致 → repadmin /replsummary
5. 服务具体服务(NETLOGON/SYSVOL)→ dcdiag /test:sysvolcheck /test:advertising
6. 票据客户端侧 → klist purge

记忆点:时间 → DNS → 连通 → 复制 → 服务 → 票据。 前两步能解决一半以上的”玄学故障”。

支持与分享

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

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

文章目录