5000个域用户怎么管理?PowerShell几分钟搞定AD日常运维
在很多企业里,Active Directory(AD)已经运行了十几年。从员工账号管理,到电脑统一管理,再到ERP、MES、OA、PLM等系统的身份认证,AD几乎已经成为企业IT基础设施的重要组成部分。但我发现一个有趣的现象:很多IT工程师每天都在管理AD,却依然习惯:
-
打开“AD用户和计算机” -
一层一层点组织单位(OU) -
一个一个查账号 -
一个一个重置密码 -
一个一个禁用用户
人数少的时候问题不大。当企业规模达到:
-
1000个用户 -
5000个用户 -
数万台终端
再继续靠鼠标运维,效率就会越来越低。这时候,PowerShell的价值就体现出来了。同样是账号管理,手工操作可能需要半天,PowerShell往往只需要几行命令。
例如:
-
批量创建用户 -
批量禁用离职账号 -
导出域用户信息 -
查询密码过期情况 -
获取计算机资产清单 -
批量修改组织架构
这些原本需要数小时完成的工作,几分钟就能处理完毕。本篇文章结合实际运维经验,整理了AD管理员最常用的PowerShell命令
0. 准备工作
# 导入 AD 模块(PowerShell 7 需显式导入)Import-Module ActiveDirectory# 指定域控执行(避免连到非预期 DC)Get-ADUser -Identity zhangsan -Server DC01.contoso.com
1. 用户管理
# 查询单个用户及属性Get-ADUser -Identity zhangsan -Properties *# 查找已禁用 / 已过期账户Get-ADUser -Filter {Enabled -eq $false} -Properties whenChangedGet-ADUser -Filter {AccountExpirationDate -lt (Get-Date)}# 查找最近未登录账户(90天未登录)$cutoff = (Get-Date).AddDays(-90)Get-ADUser -Filter {lastLogonTimestamp -lt $cutoff} -Properties lastLogonTimestamp |Select-Object Name, SamAccountName, @{n='LastLogon';e={[datetime]::FromFileTime($_.lastLogonTimestamp)}}# 新建用户New-ADUser -Name ”张三” -SamAccountName ”zhangsan” -UserPrincipalName ”zhangsan@contoso.com” `-Path ”OU=员工,DC=contoso,DC=com” -AccountPassword (ConvertTo-SecureString ”P@ssw0rd!” -AsPlainText -Force) `-Enabled $true -ChangePasswordAtLogon $true# 启用 / 禁用 / 解锁Enable-ADAccount zhangsanDisable-ADAccount zhangsanUnlock-ADAccount zhangsan# 重置密码Set-ADAccountPassword -Identity zhangsan -NewPassword (ConvertTo-SecureString ”NewP@ss!” -AsPlainText -Force) -ResetSet-ADUser -Identity zhangsan -ChangePasswordAtLogon $true# 下次登录强制改密# 移动用户 / 删除(先禁用再删)Move-ADObject -Identity ”CN=zhangsan,OU=员工,DC=contoso,DC=com” -TargetPath ”OU=离职,DC=contoso,DC=com”Remove-ADUser zhangsan -Confirm
2. 组管理
Get-ADGroup -Filter * -Properties DescriptionGet-ADGroupMember ”Domain Admins” -Recursive# 递归查看成员Add-ADGroupMember -Identity ”Domain Admins” -Members zhangsanRemove-ADGroupMember -Identity ”Domain Admins” -Members zhangsan -Confirm# 查看用户属于哪些组Get-ADPrincipalGroupMembership zhangsan
3. 计算机账户
Get-ADComputer -Filter {Enabled -eq $false}# 查停用计算机Get-ADComputer -Identity WS001 -Properties LastLogonDate, OperatingSystem# 清理失效计算机(30天未登录)$cutoff = (Get-Date).AddDays(-30)Get-ADComputer -Filter {LastLogonDate -lt $cutoff} | Remove-ADComputer -Confirm
4. 密码策略与锁定排查
# 默认域密码策略Get-ADDefaultDomainPasswordPolicySet-ADDefaultDomainPasswordPolicy -MaxPasswordAge 90 -MinPasswordLength 12# 排查账户锁定来源(核心:查 4740 事件)$user = ”zhangsan”Get-WinEvent -LogName Security -FilterXPath ”*[System[EventID=4740]]” -MaxEvents 20 |Where-Object { $_.Properties[0].Value -eq $user } |Select-Object TimeCreated, @{n='Source';e={$_.Properties[1].Value}} | Format-Table -Auto
5. 复制与域控健康(日常必查)
# 复制汇总(最常用,一行看出全林复制状态)repadmin /replsummary# 单台 DC 入站/出站复制repadmin /showrepl DC01repadmin /queue DC01# 强制立即复制repadmin /syncall /AdeP# 域控健康检查dcdiag /vdcdiag /test:replicationsdcdiag /test:dns# PowerShell 版复制状态Get-ADReplicationPartnerMetadata -Target DC01 -Partition '*' -PartnerType Both |Select-Object Server, Partner, LastReplicationSuccess, ConsecutiveFailureCount
6. FSMO 角色
Get-ADDomainController -Filter * | Select-Object Name, Domain, OperationMasterRolesMove-ADDirectoryServerOperationMasterRole -Identity DC02 -OperationMasterRole SchemaMaster# 或者用传统命令查看netdom query fsmo
7. DNS 管理
Clear-DnsServerCache -ComputerName DC01Get-DnsServerResourceRecord -ZoneName ”contoso.com” -Name ”web” -RRType AAdd-DnsServerResourceRecordA -ZoneName ”contoso.com” -Name ”web” -IPv4Address 10.0.0.10Remove-DnsServerResourceRecord -ZoneName ”contoso.com” -RRType A -Name ”web” -ForceGet-DnsServerZone -ComputerName DC01# 查看所有区域Get-DnsServerDiagnostics | Select-Object EnableLoggingForQuery, EnableLoggingForZoneTransfer# 查看 DNS 记录变更dnscmd DC01 /enumrecords contoso.com /continue
8. GPO 组策略
Get-GPO -All | Select-Object DisplayName, Owner, ModificationTimeGet-GPOReport -Name ”默认域策略” -ReportType HTML -Path ”C:\temp\gpo.html”# 导出报告Backup-GPO -Name ”默认域策略” -Path ”C:\backup\gpo”# 备份New-GPO -Name ”禁用U盘” | New-GPLink -Target ”OU=员工,DC=contoso,DC=com”# 建策略并链接# 强制刷新(客户端执行)gpupdate /force# 查看某机器生效的策略结果gpresult /r /scope computer
9. 时间同步(域控时间错乱会直接导致 Kerberos 认证失败)
w32tm /query /status# 查看同步状态w32tm /query /source# 查看时间源w32tm /config /manualpeerlist:”ntp.aliyun.com,0x1” /syncfromflags:manual /update# 改时间源w32tm /resync# 立即同步Restart-Service w32time# 重启时间服务
10. 站点与子网
Get-ADReplicationSite -Filter * | Select-Object Name, Options, SiteObjectBLGet-ADReplicationSubnet -Filter *New-ADReplicationSite -Name ”Shanghai-Site”New-ADReplicationSubnet -Name ”10.10.0.0/24” -Site ”Shanghai-Site”
11. 日志与审计(常见事件 ID)
# 4740 账户被锁、4720 新用户、4732 加组、4724 改密码、4768 Kerberos 请求Get-WinEvent -LogName Security -MaxEvents 1000 -FilterXPath ”*[System[EventID=4720]]” |Select-Object TimeCreated, @{n='User';e={$_.Properties[0].Value}}# 查域控 DNS/系统错误日志Get-EventLog -LogName System -EntryType Error -Newest 50 | Where-Object {$_.Source -match 'DNS|NETLOGON|NTDS'}
12. 日常巡检脚本骨架
$report = @()# 1. 复制状态$report += repadmin /replsummary | Out-String# 2. 无法登录的账户(密码过期)$report += ”`n=== 密码快过期/已过期的账户 ===”$report += Get-ADUser -Filter {Enabled -eq $true} -Properties msDS-UserPasswordExpiryTimeComputed |Where-Object { $_.msDS-UserPasswordExpiryTimeComputed -ne $null -and [datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed) -lt (Get-Date).AddDays(7) } |Select-Object SamAccountName, @{n='Expiry';e={[datetime]::FromFileTime($_.msDS-UserPasswordExpiryTimeComputed)}} | Out-String# 3. 时间同步$report += ”`n=== 时间状态 ===”$report += w32tm /query /status | Out-String$report | Out-File ”C:\temp\dc_audit_$(Get-Date -Format yyyyMMdd).txt”
几点实用建议:
-
先 Import-Module ActiveDirectory;PowerShell 5.1(Windows 自带)比 7 兼容性更稳,管理脚本建议用 5.1。 -
锁定排查先看事件日志里 4740 的 Caller Computer Name,比猜更准。 -
日常最值得盯的 3 个指标:复制失败(repadmin)、时间偏移(w32tm)、账户大量锁定(4740 事件)。
PowerShell不仅仅是一门脚本语言,更是一名Windows运维工程师迈向自动化运维的必经之路。学会它之后,你会发现:
以前需要半天完成的工作,现在可能几分钟就能搞定;
以前需要熬夜处理的任务,现在可能定时脚本就能自动完成。
后续我还会持续分享:
✅ PowerShell自动化运维实战
✅ Active Directory最佳实践
✅ Windows Server运维技巧
✅ Exchange管理命令大全
✅ DNS与DHCP故障排查
✅ 域控高可用部署方案
✅ AD与ERP、OA、企业微信统一身份认证实践
欢迎关注本公众号。我会持续分享20多年制造业信息化实践中的真实经验、技术干货与避坑指南。让技术少走弯路,让数字化真正创造价值。