PowerShell脚本遍历AD一级OU下Staff OU,排查一年未登录用户
解决Active Directory中扫描所有一级OU下Staff OU的PowerShell方案
我明白你遇到的问题了——AD的SearchBase参数并不支持通配符,所以你那种带*的写法肯定会报错。别担心,我们可以换个思路来实现需求:先找出所有一级学校OU,再逐个定位它们下面的Staff OU,最后在这些Staff OU里扫描过去一年未登录的用户。
具体实现步骤
- 获取所有一级学校OU:先定位到域根,只查询直接子级的OU(也就是你说的一级学校名称OU)。
- 遍历每个学校OU,定位Staff OU:对每个一级OU,检查其下是否存在名为
Staff的子OU。 - 扫描Staff OU中的目标用户:在每个有效的Staff OU中,筛选出过去一年未登录的用户(注意使用
LastLogonDate属性,它是AD复制后的统一登录时间,比LastLogon更可靠)。
完整PowerShell脚本示例
# 确保加载Active Directory模块 if (-not (Get-Module -Name ActiveDirectory)) { Import-Module ActiveDirectory } # 定义域根和一年前的日期 $domainRoot = "dc=DUNELAND,dc=LOCAL" $oneYearAgo = (Get-Date).AddYears(-1) # 获取所有一级学校OU(域根的直接子OU) $schoolOUs = Get-ADOrganizationalUnit -SearchBase $domainRoot -SearchScope OneLevel -Filter * # 遍历每个学校OU,查找对应的Staff OU并扫描用户 foreach ($schoolOU in $schoolOUs) { # 尝试获取当前学校OU下的Staff OU $staffOU = Get-ADOrganizationalUnit -SearchBase $schoolOU.DistinguishedName -SearchScope OneLevel -Filter { Name -eq "Staff" } -ErrorAction SilentlyContinue if ($staffOU) { Write-Host "正在扫描OU: $($staffOU.DistinguishedName)" # 查找该Staff OU中过去一年未登录的用户,排除已禁用用户(可根据需求调整) $inactiveUsers = Get-ADUser -SearchBase $staffOU.DistinguishedName -SearchScope Subtree -Filter { LastLogonDate -lt $oneYearAgo -and Enabled -eq $true } -Properties LastLogonDate, DisplayName # 输出结果(也可以导出到CSV,比如 | Export-Csv -Path "InactiveStaffUsers.csv" -Append -NoTypeInformation) if ($inactiveUsers) { $inactiveUsers | Select-Object DisplayName, SamAccountName, LastLogonDate, DistinguishedName } else { Write-Host " 该OU中无符合条件的用户" } } else { Write-Host "学校OU $($schoolOU.Name) 下未找到Staff OU,跳过" } }
脚本说明
- 模块检查:开头先确认ActiveDirectory模块已加载,避免运行报错。
- 日期计算:
$oneYearAgo自动计算当前日期往前推一年的时间点,无需手动输入。 - 容错处理:用
-ErrorAction SilentlyContinue处理找不到Staff OU的情况,避免脚本中断。 - 结果输出:默认输出到控制台,你可以注释掉控制台输出,换成
Export-Csv命令将结果导出到CSV文件方便后续处理。
内容的提问来源于stack exchange,提问作者Trenton Tyler
相关产品推荐
相关产品推荐

