列出组织单位(OU)是最常见的 AD 管理 任务之一,无论是审核目录结构、验证委派边界还是清理环境。共有三种实用方法:Get-ADOrganizationalUnit PowerShell cmdlet、Active Directory Users and Computers(ADUC)控制台和 ADManager Plus。
Get-ADOrganizationalUnit 是 Active Directory PowerShell 模块 中的一个 cmdlet,用于通过其标识检索单个 OU 或执行搜索以返回多个 OU。OU 是用于分组用户、计算机、组和其他 OU 的容器,以便您可以应用组策略并在 OU 级别委派权限。管理员通过编程方式查询 OU,以审核 Active Directory 层级和结构、确认委派并保持目录有序。
每个 OU 由其专有名称(DN)标识,cmdlet 返回的 OU 对象的属性如 Name, canonicalName, 和 ProtectedFromAccidentalDeletion 可以格式化、过滤和导出。要列出 OU 内的用户或计算机,请使用 Get-ADUser 限定到 OU。
列出域中所有 OU 的全面方法是将 -Filter 参数与 Format-Table 结合使用。通配符过滤器 * 匹配所有 OU。
Get-ADOrganizationalUnit -Filter * | Format-Table Name, DistinguishedName -AutoSize
如果查询未返回任何结果,则域中没有匹配的 OU,cmdlet 返回空结果而非错误,因此如果您根据输出执行操作,请在大型脚本中添加错误处理。
* 通配符告诉 cmdlet 跳过过滤并返回所有内容,而 Format-Table 将输出修剪为两列,以便 400 个 OU 的林能适合屏幕。添加 -AutoSize 以使列宽适应您的控制台。
-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-Table 或 Select-Object 以选择显示的列。
要返回单个 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 参数控制从 SearchBase 开始搜索的深度。
Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Departments,DC=skyy,DC=com" `
-SearchScope OneLevel
使用 -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,请选择所需属性并管道传递给 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 不包含子对象,是清理时的候选对象。您可以通过使用 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 可保持目录整洁,避免孤立容器。
在大型目录中,使用 -ResultPageSize 控制每页返回的对象数,使用 -ResultSetSize 限制返回的对象总数。使用 -Partition 针对应用分区,而非默认的域分区。
当无法安装 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 树的最快方式。它以视觉方式呈现 OU 层级,适合快速导航而非生成报告。
要查看哪些GPO应用于某个OU,打开Group Policy Management Console并选择该OU。Linked Group Policy Objects选项卡按优先级顺序列出GPO。这相当于在PowerShell中运行Get-GPInheritance。
ADManager Plus,一个AD reporting tool,是无需脚本的PowerShell和ADUC替代方案。您无需编写和维护PowerShell脚本,只需选择报告、选择域,然后几次点击即可生成并导出多种格式的结果。
这意味着当前会话中未加载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或DC的读取权限。请以具有目录读取权限的用户身份运行PowerShell,或使用-Credential传递其他凭据:
$cred = Get-Credential # e.g. SKYY\sjacobs
Get-ADOrganizationalUnit -Filter * -Credential $cred
例如,Mark Jacob(mjacob)可能对某个OU子树有读取权限,但对另一个没有。使用-SearchBase限定查询范围到他被委派管理的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。
它通过身份检索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