Windows AD Powershell
AD 运维 PowerShell 常用命令集合
按场景分类,每个命令都标注了”什么时候用”。
和 Windows AD 巡检 的区别:那篇讲怎么巡检,这篇是命令速查。配合使用。
阅读指引
这份集合按场景分类,三种用法:
| 你的情况 | 从哪开始 |
|---|---|
| 正在排障 | 直接跳到最后的 数字口诀,按顺序查 |
| 想系统学 | 从 第一节 往下看 |
| 只查某个命令 | Ctrl+F 搜关键词 |
目录
一、用户与账户
查用户
# 查单个用户的基本信息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改用户
# 启用/禁用账户Enable-ADAccount -Identity qianyueDisable-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
# 移动用户到另一个 OUMove-ADObject -Identity "CN=浅月,OU=User,DC=qy,DC=net" -TargetPath "OU=NewOU,DC=qy,DC=net"⚠️ 重置密码后”用户说登不上”的常见原因:只改了密码、没解锁账户,或没考虑”下次登录须更改密码”。 排查时先
Search-ADAccount -LockedOut看一眼,比翻事件日志快。
二、组与成员
# 查组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排查”这个人明明在组里为什么没权限”时,嵌套组是重灾区。
三、计算机
# 查所有计算机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
# 列出所有 DCGet-ADDomainController -Filter *
# 查 FSMO 角色持有者netdom query fsmo
# 查 FSMO 健康(当前 DC 能否联系所有角色持有者)dcdiag /test:fsmocheck
# 查 GC 覆盖Get-ADDomainController -Filter * | Select Name, Site, IsGlobalCatalog
# 查域功能级别Get-ADDomain | Select DomainMode, ForestGet-ADForest | Select ForestMode💡 纯 PowerShell 查 FSMO(不依赖
netdom,适合 Server Core / 无 RSAT 环境):Terminal window Get-ADForest | Select SchemaMaster, DomainNamingMasterGet-ADDomain | Select PDCEmulator, RIDMaster, InfrastructureMaster5 个角色:Schema Master、Domain Naming Master(林级)+ PDC Emulator、RID Master、Infrastructure Master(域级)。
五、复制健康
# 复制摘要(最常用)repadmin /replsummary
# 只看失败的repadmin /replsummary /errorsonly
# 按失败率排序repadmin /replsummary /sort:percent
# 查某台 DC 的复制详情repadmin /showrepl QYNET-CORE01
# 详细模式,带错误码repadmin /showrepl QYNET-CORE01 /verbose
# 导出 CSVrepadmin /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 健康检查
# 全林全项检查,只报错dcdiag /e /q /c
# 只测复制dcdiag /test:replications
# 只测连通性dcdiag /test:connectivity
# 只测 DNSdcdiag /test:DNS /v
# 只测 SYSVOLdcdiag /test:sysvolcheck /test:advertising
# 只测 FSMOdcdiag /test:fsmocheck💡 排障时的顺序:先
/test:connectivity确认能通,再/test:DNS,最后才看具体服务测试。 DNS 挂了,后面所有测试都会失败——先看 DNS 能省掉一大半迷惑性的报错。
七、DNS 与 SPN
# 查 SRV 记录nslookup -type=SRV _ldap._tcp.qy.netnslookup -type=SRV _kerberos._tcp.qy.netnslookup -type=SRV _gc._tcp.qy.net
# 查某账户注册了哪些 SPNsetspn -L QYNET-CORE01
# 反向查某个 SPN 被谁注册setspn -Q HTTP/testweb.qy.net
# 全林查重复 SPNsetspn -X
# 安全添加 SPNsetspn -S HTTP/testweb.qy.net svc_testweb
# 删除 SPNsetspn -D HTTP/testweb.qy.net svc_testweb💡 为什么强调
setspn -S而不是-A:-S(Add,带检查)会先查重再添加,重复就报错;-A(Add)会直接写进去,制造重复 SPN。 重复 SPN 会导致 Kerberos 认证随机失败(票据请求指向错误的账户),且极难排查。永远用-S。
💡 Kerberos 认证失败的经典三连(服务账号场景的完整排查链):
- SRV 记录在不在 ——
nslookup -type=SRV _kerberos._tcp.<域>- SPN 挂在正确的账户上没 ——
setspn -L <服务账户>- 有没有重复 SPN ——
setspn -X- 客户端拿到票据没 ——
klist- KDC 报什么错 —— 事件日志看 4771 / 4768
这五步能覆盖绝大部分”服务账号认证失败”的工单。
八、Kerberos 与票据
# 看当前票据klist
# 清空票据,强制重新获取klist purge
# 看票据详情klist -e💡
klist purge是万能第一步:改过权限、加过组、改过 SPN 之后,客户端往往还拿着旧票据。 让用户klist purge或直接注销重登,比在服务端查半天快得多。
九、时间同步
# 查时间源w32tm /query /source
# 查时间状态w32tm /query /status
# 强制同步w32tm /resync /force
# 查与时间源的偏差w32tm /stripchart /computer:ntp.aliyun.com /samples:5
# 配置外网 NTPw32tm /config /syncfromflags:manual /manualpeerlist:"ntp.aliyun.com,0x8" /reliable:yes /updatenet stop w32time && net start w32time⚠️ 时间偏差 > 5 分钟会导致 Kerberos 直接拒绝认证(默认
MaxClockSkew)。 遇到”昨天还好好的,今天所有人都登不上域”,先查时间,别急着查复制。💡 域内时间层次:PDC Emulator 应对接外部 NTP,其他 DC 从 PDC 同步,成员机从任意 DC 同步。 所以配外网 NTP 只需要在 PDC 上做。
十、事件日志
# 查账户锁定事件(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 |
| 4771 | Kerberos 预认证失败(密码错 / 时间偏差 / 账户禁用) |
| 4776 | NTLM 凭据验证失败 |
| 5136 | 目录对象被修改 |
💡 4625 和 4771 的区别:域环境里 Kerberos 是首选,所以密码错通常报 4771; 只有回退到 NTLM 时才报 4776。查”密码错误导致锁定”要先看 4771 而不是 4625。
💡 4648 是横向移动的强信号:正常用户极少触发(除非
runas)。 短时间内大量 4648 出现在非管理机上,值得追查。💡 4771 的三个子状态码(在事件详情里看):
失败代码 含义 0x18密码错误 0x12账户被禁用 / 锁定 / 过期 0x25时钟偏差过大 ← 时间同步没做好就是它 所以 4771 出现
0x25,直接去查w32tm,别再查密码了。
十一、备份与恢复
# 查可用备份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 权限
- ⚠️ 开启后不可关闭(官方明确说明)
- 开启瞬间会导致全林复制一次,建议在低峰期做
# 查是否已开启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 授权不会自动回到删除前状态(需要额外处理)。 恢复后记得核对组归属。
十二、磁盘与性能
# 查磁盘空间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 5Get-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一起看。
十三、站点与服务
# 查所有站点Get-ADReplicationSite -Filter *
# 查站点链接Get-ADReplicationSiteLink -Filter *
# 查子网Get-ADReplicationSubnet -Filter *
# 查某台 DC 的复制连接Get-ADReplicationConnection -Filter *💡 子网没定义会导致客户端”就近登录”失效——客户端会随机选 DC, 表现为”登录慢""跨站点流量异常”。排查时先确认客户端 IP 所在子网已在 AD 站点中定义。
十四、清理与维护
# 查孤立的 SID(账户被删但权限还在)# 没有直接命令,需要结合 ACL 工具
# 查空 OUGet-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 相关
# 查所有 GPOGet-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
# 备份所有 GPOBackup-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. DNS | DNS 挂了所有测试都失败 → nslookup -type=SRV _ldap._tcp.<域> |
| 3. 连通 | 端口通不通 → dcdiag /test:connectivity |
| 4. 复制 | 数据一致不一致 → repadmin /replsummary |
| 5. 服务 | 具体服务(NETLOGON/SYSVOL)→ dcdiag /test:sysvolcheck /test:advertising |
| 6. 票据 | 客户端侧 → klist purge |
记忆点:时间 → DNS → 连通 → 复制 → 服务 → 票据。 前两步能解决一半以上的”玄学故障”。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













