Get-ADUser cmdlet 是用于从 Active Directory (AD) 获取用户帐户信息的基本 PowerShell 命令。无论您是需要审核用户帐户、生成报告还是执行批量操作,Get-ADUser 都提供了强大的筛选和搜索功能。然而,在处理多个组织单位 (OU) 和复杂筛选需求时,该过程可能耗时且需要高级脚本知识。
使用 Get-ADUser 命令从多个 OU 获取 AD 用户:
Import-Module ActiveDirectory
$ous = 'OU=Sample1,DC=example1,DC=com','OU=Sample2,DC=example2,DC=com'
$ous | ForEach-Object {
Get-ADUser -Filter * -SearchBase $_ |
Select Name, DistinguishedName
} | Export-CSV -Path "C:\export.csv" -NoTypeInformation
使用 ADManager Plus 列出多个 OU 中的 AD 用户:
检索域中销售和市场营销组织单位的所有用户帐户。
$ous = 'OU=Sales,DC=contoso,DC=com','OU=Marketing,DC=contoso,DC=com'
$ous | ForEach { Get-ADUser -Filter * -SearchBase $_ }
此脚本定义多个 OU 并从每个指定的组织单位检索所有用户。
生成包含多个部门用户名和电子邮件地址的 CSV 文件。
$ous = 'OU=IT,DC=contoso,DC=com','OU=HR,DC=contoso,DC=com','OU=Finance,DC=contoso,DC=com'
$ous | ForEach { Get-ADUser -Filter * -SearchBase $_ -Properties EmailAddress | Select Name,SamAccountName,EmailAddress } | Export-CSV "C:\Users\MultiOU_Report.csv" -NoTypeInformation
这将从 IT、HR 和财务 OU 导出用户详细信息到单个 CSV 文件,包含特定属性。
仅检索包括所有子 OU 在内的父 OU 中已启用的用户帐户。
Get-ADUser -Filter {Enabled -eq $true} -SearchBase "OU=Corporate,DC=contoso,DC=com" -SearchScope Subtree -Properties Department,Title
此查询检索企业 OU 及其所有子 OU 中的所有已启用用户,包括部门和职位信息。
| 参数 | 描述 |
|---|---|
| -Identity | 通过区分名称、GUID、安全标识符或 SAM 帐户名指定 AD 用户对象 |
| -Filter | 使用 PowerShell 表达式语言指定查询字符串以检索多个对象 |
| -SearchBase | 指定要搜索的 AD 路径(OU 或容器的区分名称 (DN)) |
| -SearchScope | 指定 AD 搜索范围(Base、OneLevel 或 Subtree) |
| -Properties | 指定要检索的用户属性(默认返回有限属性集) |
| -LDAPFilter | 指定用于筛选用户的 LDAP 查询字符串 |
要从多个 OU 检索用户,请创建 OU 唯一名称数组,并使用 ForEach-Object 结合 Get-ADUser 进行迭代:
$ous = @('OU=Sales,DC=domain,DC=com','OU=HR,DC=domain,DC=com')
$ous | ForEach-Object { Get-ADUser -Filter * -SearchBase $_ }
这种方法允许您在单次脚本执行中查询多个组织单位。
OneLevel 仅搜索指定 OU 的直接子对象,不包括子 OU。Subtree 搜索整个层级,包括所有嵌套的 OU。针对多个 OU 场景:
包含 -Properties 参数以检索附加属性,然后通过 Export-CSV 管道输出结果:
$ous = @('OU=IT,DC=contoso,DC=com','OU=Finance,DC=contoso,DC=com')
$users = foreach ($ou in $ous) {
Get-ADUser -Filter * -SearchBase $ou -Properties EmailAddress, Department, Title |
Select Name, SamAccountName, EmailAddress, Department, Title
}
$users | Export-CSV "C:\Reports\MultiOU_Users.csv" -NoTypeInformation
常见性能问题及解决方案:
结合 OU 迭代和过滤条件。例如,只获取启用且有电子邮件地址的用户:
$ous = @('OU=Sales,DC=domain,DC=com','OU=Marketing,DC=domain,DC=com')
$ous | ForEach-Object {
Get-ADUser -Filter {Enabled -eq $true -and EmailAddress -like "*"} -SearchBase $_
}
可以,为每个域指定 -Server 参数:
$ouList = @(
@{OU='OU=Users,DC=domain1,DC=com'; Server='dc1.domain1.com'},
@{OU='OU=Users,DC=domain2,DC=com'; Server='dc2.domain2.com'}
)
foreach ($item in $ouList) {
Get-ADUser -Filter * -SearchBase $item.OU -Server $item.Server
}
Get-ADUser 默认返回以下属性:
若要检索如 EmailAddress、Department 或 Manager 等附加属性,请使用 -Properties 参数。
含特殊字符的 OU 需要正确转义。对于包含逗号的 OU,请使用反斜杠("\\")。
如果 OU 名称是 "Sales, North America":
$ou = 'OU=Sales\, North America,DC=contoso,DC=com'
Get-ADUser -Filter * -SearchBase $ou
对于括号或其他特殊字符,请使用单引号并根据需要转义。
查询 OU 数量没有硬性限制,但需考虑:
为了获得最佳性能,处理 50 个以上 OU 时请分批查询或实现分页。
生成包含每个 OU 用户计数的汇总报告:
$ous = @('OU=Sales,DC=domain,DC=com','OU=IT,DC=domain,DC=com')
$report = foreach ($ou in $ous) {
$users = Get-ADUser -Filter * -SearchBase $ou -SearchScope OneLevel
[PSCustomObject]@{
OU = $ou
UserCount = $users.Count
}
}
$report | Format-Table -AutoSize