如何获取 AD 中的 OU 列表

最后更新于:

列出组织单位(OU)是最常见的 AD 管理 任务之一,无论是审核目录结构、验证委派边界还是清理环境。共有三种实用方法:Get-ADOrganizationalUnit PowerShell cmdlet、Active Directory Users and Computers(ADUC)控制台和 ADManager Plus

  • PowerShell
  • ADUC
  • ADManager Plus
  • 为什么选择 ADManager Plus
  • 常见问题解答
 

什么是 Get-ADOrganizationalUnit?

Get-ADOrganizationalUnitActive Directory PowerShell 模块 中的一个 cmdlet,用于通过其标识检索单个 OU 或执行搜索以返回多个 OU。OU 是用于分组用户、计算机、组和其他 OU 的容器,以便您可以应用组策略并在 OU 级别委派权限。管理员通过编程方式查询 OU,以审核 Active Directory 层级和结构、确认委派并保持目录有序。

每个 OU 由其专有名称(DN)标识,cmdlet 返回的 OU 对象的属性如 Name, canonicalName,ProtectedFromAccidentalDeletion 可以格式化、过滤和导出。要列出 OU 内的用户或计算机,请使用 Get-ADUser 限定到 OU

如何列出域中的所有 OU

列出域中所有 OU 的全面方法是将 -Filter 参数与 Format-Table 结合使用。通配符过滤器 * 匹配所有 OU。

Get-ADOrganizationalUnit -Filter * | Format-Table Name, DistinguishedName -AutoSize

如果查询未返回任何结果,则域中没有匹配的 OU,cmdlet 返回空结果而非错误,因此如果您根据输出执行操作,请在大型脚本中添加错误处理。

* 通配符告诉 cmdlet 跳过过滤并返回所有内容,而 Format-Table 将输出修剪为两列,以便 400 个 OU 的林能适合屏幕。添加 -AutoSize 以使列宽适应您的控制台。

使用 Filter 参数查询 OU

-Filter 参数使用 PowerShell 表达式语言语法缩小结果范围。您可以按名称、任何 OU 对象属性以及使用通配符过滤。要检索名称以 Sales 开头的 OU,请执行:

Get-ADOrganizationalUnit -Filter "Name -like 'Sales*'" |
Format-Table Name, DistinguishedName -AutoSize

按特定属性过滤

Get-ADOrganizationalUnit -Filter "ProtectedFromAccidentalDeletion -eq '$true'" `
-Properties ProtectedFromAccidentalDeletion

使用 -Properties 参数提取默认不返回的扩展属性,并通过管道传递给 Format-TableSelect-Object 以选择显示的列。

使用 Identity, SearchBase,SearchScope 检索特定 OU

要返回单个 OU,请将其 DN 传递给 -Identity,用法如下:

Get-ADOrganizationalUnit -Identity "OU=Sales,DC=skyy,DC=com" -Properties *

要将搜索限制在子树中,请将 -SearchBase 设置为父 DN。您可以使用 Get-ADDomain 动态构建 SearchBase 以检索域的 DN。

Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Departments,DC=skyy,DC=com"

使用 SearchScope 控制查询深度

-SearchScope 参数控制从 SearchBase 开始搜索的深度。

  • Base:仅返回 SearchBase 对象本身。
  • OneLevel:仅返回直接子 OU。
  • Subtree:返回 SearchBase 及其所有嵌套的 OU。
Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Departments,DC=skyy,DC=com" `
-SearchScope OneLevel

使用 Server 和 Credential 查询远程域

使用 -Server 指定特定域控制器(DC),并使用 -Credential 传递备用凭据以进行跨域或委派查询:

$cred = Get-Credential # e.g. SKYY\sjacobs
Get-ADOrganizationalUnit -Filter * -Server "dc01.skyy.com" -Credential $cred

此处,Steve Jacobs(sjacobs)提供委派凭据以查询远程 skyy.com DC。

将 OU 数据导出为 CSV

要导出 OU,请选择所需属性并管道传递给 Export-Csv。指定 UTF-8 编码以避免字符问题,并使用 -NoTypeInformation 省略类型头:

Get-ADOrganizationalUnit -Filter * -Properties CanonicalName, ProtectedFromAccidentalDeletion |
Select-Object Name, DistinguishedName, CanonicalName, ProtectedFromAccidentalDeletion |
Export-Csv "C:\Reports\skyy-OUs.csv" -NoTypeInformation -Encoding UTF8

每增加一种格式或列都需要编辑并重新运行脚本。相比之下,ADManager Plus 提供一键导出为 CSV、PDF、HTML、CSVDE 和 XLSX。您还可以 使用 ADManager Plus 生成 OU 报告

查找空 OU 及管理 OU 清理

空 OU 不包含子对象,是清理时的候选对象。您可以通过使用 Get-ADObject 测试每个 OU 是否有子对象来检测它们:

Get-ADOrganizationalUnit -Filter * | ForEach-Object {
$children = Get-ADObject -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel
if (($children | Measure-Object).Count -eq 0) { $_.DistinguishedName }
}

删除 OU 之前,请检查 ProtectedFromAccidentalDeletion 属性。当其设置为 $true 时,AD 会阻止删除,直到您清除此设置。还要确认哪些 组策略对象(GPO) 链接到该 OU,因为删除或重组 OU 会更改策略应用,并使用 Get-GPInheritance 审核更改前 OU 链接的 GPO。定期审核 OU 可保持目录整洁,避免孤立容器。

使用 ADSI Searcher 获取 OU

在大型目录中,使用 -ResultPageSize 控制每页返回的对象数,使用 -ResultSetSize 限制返回的对象总数。使用 -Partition 针对应用分区,而非默认的域分区。

在无 AD 模块情况下使用 ADSI Searcher

当无法安装 RSAT 时,内置的 ADSI DirectorySearcher 可在无 AD 模块的情况下查询目录:

$searcher = [adsisearcher]"(objectClass=organizationalUnit)"
$searcher.SearchRoot = [adsi]"LDAP://DC=skyy,DC=com"
$searcher.PageSize = 1000
$searcher.FindAll() | ForEach-Object { $_.Properties.distinguishedname }

在 ADUC 中查看 OU

ADUC 控制台是单域中快速可视化浏览 OU 树的最快方式。它以视觉方式呈现 OU 层级,适合快速导航而非生成报告。

在 ADUC 中查看 OU 的步骤

  1. Win + R,输入 dsa.msc,然后按 Enter
  2. View菜单中,启用Advanced Features,以便显示系统容器和完整的OU树。
  3. 在左侧窗格中展开您的域节点,以文件夹形式查看带有独特OU图标的OU。
  4. 展开任意OU以查看嵌套的OU及其包含的对象。
  5. 右键单击OU并选择Properties查看其属性;在Object选项卡中,您可以确认是否启用了Protect object from accidental deletion

在ADUC中检查GPO链接

要查看哪些GPO应用于某个OU,打开Group Policy Management Console并选择该OU。Linked Group Policy Objects选项卡按优先级顺序列出GPO。这相当于在PowerShell中运行Get-GPInheritance

使用ADManager Plus列出OU

ADManager Plus,一个AD reporting tool,是无需脚本的PowerShell和ADUC替代方案。您无需编写和维护PowerShell脚本,只需选择报告、选择域,然后几次点击即可生成并导出多种格式的结果。

  1. 登录 ADManager Plus。
  2. 导航至Reports > Contact & OU Reports > OU General Reports > All OUs
  3. 选择域并点击Generate
  4. 点击Export As 将报告导出为CSV、PDF、HTML、CSVDE或XLSX格式。
显示 OU 列表及其详细信息的所有 OU 报告

常见错误排查

  • 未识别术语Get-ADOrganizationalUnit

    这意味着当前会话中未加载Active Directory模块。请确认已安装该模块,然后导入:

    Get-Module -ListAvailable ActiveDirectory
    Import-Module ActiveDirectory

    如果命令无返回,说明模块未安装。启用RSAT或在Windows Server上运行Install-WindowsFeature RSAT-AD-PowerShell

  • 无法联系服务器或找不到默认服务器

    这是因为PowerShell无法连接到DC。通常发生在非域加入的机器上,或DNS无法解析域名时。请使用-Server明确指定可访问的DC。

    Get-ADOrganizationalUnit -Filter * -Server "dc01.skyy.com"

    使用nslookup dc01.skyy.com验证名称解析,并确认目标DC上Active Directory Web Services服务正在运行,因为AD cmdlet依赖该服务。

  • 查询或删除OU时访问被拒绝

    运行查询的账户缺少目标OU或DC的读取权限。请以具有目录读取权限的用户身份运行PowerShell,或使用-Credential传递其他凭据:

    $cred = Get-Credential # e.g. SKYY\sjacobs
    Get-ADOrganizationalUnit -Filter * -Credential $cred

    例如,Mark Jacob(mjacob)可能对某个OU子树有读取权限,但对另一个没有。使用-SearchBase限定查询范围到他被委派管理的OU,以避免对无权限分支的访问错误。

  • 无法删除OU;尽管有管理员权限仍被拒绝访问

    当管理员删除失败时,OU几乎总是启用了防止意外删除保护。请先清除此标志,然后使用以下命令删除:

    Set-ADOrganizationalUnit -Identity "OU=Sales,DC=skyy,DC=com" `
    -ProtectedFromAccidentalDeletion $false
    Remove-ADOrganizationalUnit -Identity "OU=Sales,DC=skyy,DC=com"

    嵌套的子OU也可能受到保护。请先清除每个嵌套OU的保护,然后使用-Recursive参数删除,因为它不会绕过ProtectedFromAccidentalDeletion

使用ADUC和PowerShell方法的限制

  • 需要AD模块和权限: 脚本仅在安装了RSAT或AD DS角色且账户具有目录读取权限的环境中运行。
  • 每次更改都需编辑脚本: 添加属性或更改导出格式需要重写并重新运行脚本,耗时且繁琐。
  • 格式处理需手动完成: 每种输出格式都需单独编写逻辑,增加LDAP查询复杂度。
  • 故障排除需专业知识: 调试筛选器、范围和凭据需要扎实的AD和脚本知识。

团队选择 ADManager Plus 的原因

  • 无脚本报告: 通过GUI生成OU列表和详细信息,无需编写或维护PowerShell脚本。
  • 一键多格式导出: 无需编辑代码即可将同一报告导出为CSV、PDF、HTML、CSVDE和XLSX格式。
  • 内置报告和调度: 使用预设的OU报告并安排自动运行和发送。
  • 集中OU管理: 从一个控制台创建、修改、移动和清理OU,并管理委派,适合大规模检索OU详细信息

常见问题解答

它通过身份检索OU或搜索AD返回多个OU,方便管理员审核结构、验证委派和生成OU报告。

运行以下命令。

Get-ADOrganizationalUnit -Filter * | Format-Table Name, DistinguishedName -AutoSize

-Filter *值匹配域中的所有OU。

将cmdlet通过Select-Object选择列,然后通过Export-Csv "C:\OUs.csv" -NoTypeInformation -Encoding UTF8导出。

遍历 OU 并使用作用域限定为每个 OU 的 DN 的 Get-ADObject 在 OneLevel 级别;没有子对象的 OU 是空的,可以清理。

查询 ProtectedFromAccidentalDeletion 属性:

Get-ADOrganizationalUnit -Identity "OU=Sales,DC=skyy,DC=com" -Properties ProtectedFromAccidentalDeletion

从单一控制台管理和报告 OU

Active Directory管理与报告的一站式解决方案
电子邮件下载链接 Email the ADManager Plus download link