如何使用 PowerShell 列出多个 OU 中的用户

Get-ADUser cmdlet 是用于从 Active Directory (AD) 获取用户帐户信息的基本 PowerShell 命令。无论您是需要审核用户帐户、生成报告还是执行批量操作,Get-ADUser 都提供了强大的筛选和搜索功能。然而,在处理多个组织单位 (OU) 和复杂筛选需求时,该过程可能耗时且需要高级脚本知识。

PowerShell

使用 Get-ADUser 命令从多个 OU 获取 AD 用户:

  1. 选择要生成报告的域。
  2. 选择将用作生成报告参数的 LDAP 过滤器。
  3. 在 Properties 参数中,指定应在报告中显示的其他用户对象属性。
  4. 确定要导出报告的格式。
  5. 仔细检查编写脚本时是否遵循了正确的语法。
  6. 使用 Windows PowerShell 编写并执行脚本。
  7. To generate the report in a different format—or to add additional properties to the reports—modify the script accordingly.
    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

使用 ADManager Plus 列出多个 OU 中的 AD 用户:

  1. 导航至 Reports > General Reports > All Users
  2. 选择所需的域和 OU 以筛选用户。
  3. 点击 Generate
  4. 报告生成后,点击 Export As 以 HTML、CSV、XLS 或 PDF 格式下载。

示例用例和脚本

示例 1:获取多个特定 OU 中的所有用户

检索域中销售和市场营销组织单位的所有用户帐户。

$ous = 'OU=Sales,DC=contoso,DC=com','OU=Marketing,DC=contoso,DC=com'
$ous | ForEach { Get-ADUser -Filter * -SearchBase $_ }

此脚本定义多个 OU 并从每个指定的组织单位检索所有用户。

示例 2:将多个 OU 的用户导出为 CSV

生成包含多个部门用户名和电子邮件地址的 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 文件,包含特定属性。

示例 3:获取子 OU 中已启用的用户

仅检索包括所有子 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 查询字符串

使用 PowerShell 获取 AD 用户的限制

  • 复杂的语法要求: 即使是轻微的语法错误或拼写错误也会导致脚本完全失败,需要调试时间。
  • 有限的错误处理: 遇到特殊字符或权限问题时,脚本会静默失败或显示难以理解的错误。
  • 手动循环构建: 从多个 OU 检索用户需要使用 for-each 循环和数组管理。
  • 导出格式限制: 更改导出格式需要修改脚本并添加额外的 cmdlet。
  • 属性选择复杂: 添加或删除用户属性需要编辑脚本并重新执行。
  • 特殊字符处理: OU 名称包含特殊字符时需要使用转义序列并谨慎处理字符串。
  • 无可视预览: 导出前无法预览结果,除非运行单独的命令。

使用 ADManager Plus 获取 AD 用户的亮点

  • 无脚本操作: 通过直观的网页界面完成所有用户报告任务,无需编写任何代码。
  • 200+ 预构建报告 即开即用,访问涵盖 AD 用户管理各方面的全面用户报告。
  • 多 OU 选择: 通过简单的复选框选择多个 OU,无需数组或循环。
  • 一键导出 立即导出报告为 CSV、PDF、HTML 和 XLS 格式,无需额外命令。
  • 自定义报告生成器 通过拖放属性选择和可视化查询构建器创建定制报告。
  • 自动调度 使用内置调度器设置定期报告并通过电子邮件发送。
  • 实时预览: 导出前即时查看报告结果,支持实时数据预览。

使用 ADManager Plus 获取多个 OU 的 AD 用户列表

常见问题解答

要从多个 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 场景:

  • 当只需要特定 OU 的用户时,使用 OneLevel
  • 当您需要包括子 OU 中的所有用户时,请使用 Subtree
  • 如果未指定,默认使用 Subtree

包含 -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

常见性能问题及解决方案:

  • 结果集过大: 使用特定过滤器替代 -Filter *
  • 属性过多: 仅使用 -Properties 请求所需属性
  • 网络延迟: 查询离您位置更近的域控制器
  • 循环效率低: 使用管道操作替代嵌套的 for-each 循环
  • 无分页: 对于大数据集,使用 -ResultSetSize 实现结果限制

结合 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 默认返回以下属性:

  • DistinguishedName
  • 已启用
  • GivenName
  • 姓名
  • ObjectClass
  • ObjectGUID
  • SamAccountName
  • SID
  • 姓氏
  • UserPrincipalName

若要检索如 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 数量没有硬性限制,但需考虑:

  • 内存使用: 大结果集会消耗大量内存
  • 执行时间: OU 数量越多,处理时间越长
  • 网络带宽: 每次查询都会产生网络流量
  • 域控制器负载: 过多查询可能影响 DC 性能

为了获得最佳性能,处理 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
Active Directory管理与报告的一站式解决方案
电子邮件下载链接 Email the ADManager Plus download link