如何修改PowerShell脚本仅查询指定OU中14天内禁用的AD用户
Got it,我帮你调整这个脚本,刚好能满足你只从特定OU查询最近14天内被禁用用户的需求。先修正原脚本里的小问题,再给你上优化后的版本:
修改后的完整脚本
# 定义查询时间范围:过去14天 $date = (Get-Date).AddDays(-14) # 替换成你实际要查询的OU的LDAP路径(可在AD用户和计算机中查看OU属性获取) $targetOU = "OU=SalesTeam,DC=contoso,DC=com" # 获取一个可用的域控制器(也可以直接指定DC名称,比如"-Server DC01.contoso.com") $domainController = Get-ADDomainController | Select-Object -First 1 # 第一步:从目标OU中筛选出已禁用的用户,先缩小范围(只保留最近14天有修改的对象) $candidateUsers = Get-ADObject -SearchBase $targetOU ` -Filter 'ObjectClass -eq "User" -and UserAccountControl -band 2' ` -Properties whenChanged | Where-Object { $_.whenChanged -ge $date } # 第二步:遍历候选用户,获取UserAccountControl属性的实际修改时间(即真正的禁用时间) foreach ($user in $candidateUsers) { Get-ADReplicationAttributeMetadata $user -Server $domainController.Name ` -Properties UserAccountControl | Where-Object { $_.AttributeName -eq 'UserAccountControl' } | Select-Object ` @{Name="用户对象"; Expression={$_.Object}}, @{Name="禁用时间"; Expression={$_.LastOriginatingChangeTime}} | Where-Object { $_.禁用时间 -gt $date } }
关键改动说明
- 限定查询范围到特定OU:新增
-SearchBase参数,直接指定目标OU的LDAP路径,避免扫描整个域,大幅提升查询效率。记得把$targetOU的值替换成你实际需要的OU路径。 - 修正原脚本的变量错误:原脚本里误用了未定义的
$sixMonthsAgo变量,改成了正确的$date。 - 提前缩小处理范围:在
Get-ADObject阶段就先过滤已禁用的用户,并且加上whenChanged的初步筛选,减少后续需要处理的对象数量。 - 优化输出可读性:用
Select-Object重命名字段,让输出的结果更直观易懂。 - 避免参数类型问题:
Get-ADDomainController返回的是对象,所以用$domainController.Name作为-Server参数的值,确保参数格式正确。
额外提示
如果你的环境中有多个域控制器,也可以直接指定某个DC的名称(比如$domainController = "DC01.contoso.com"),这样查询结果会更稳定。
内容的提问来源于stack exchange,提问作者hightest
相关产品推荐
相关产品推荐

