You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PowerShell在Active Directory中搜索用户并遍历上层所有OU目录

解决PowerShell遍历多上层OU查询AD用户的问题

我完全懂你的困扰——你想遍历多个上层OU,每个下面都有OU=Site,OU=USERS的固定结构,但直接用OU=*会触发LDAP语法错误,而且原来的$_也没法自动对应到各个上层OU,对吧?下面给你两种可行的解决方案:

方法1:自动获取所有目标上层OU并遍历

如果你的上层OU有统一的命名规则或者位于同一个父目录下,可以先通过Get-ADOrganizationalUnit把它们全部捞出来,再逐个循环查询:

# 第一步:获取所有需要遍历的上层OU(根据实际情况调整Filter和SearchBase)
# 比如假设所有上层OU都在DC=domain下,且名称包含"Region"
$upperOUs = Get-ADOrganizationalUnit -Filter "Name -like '*Region*'" -SearchBase "DC=domain" -Server ServerName

# 第二步:循环每个上层OU,拼接完整的SearchBase并查询用户
foreach ($ou in $upperOUs) {
    # 拼接LDAP路径:固定的OU=USERS,OU=Site + 上层OU的完整DN
    $searchBase = "OU=USERS,OU=Site,$($ou.DistinguishedName)"
    
    # 执行AD用户查询
    Get-ADUser -Filter * -Properties EmailAddress, DisplayName -SearchBase $searchBase -Server ServerName | 
        Select-Object DisplayName, EmailAddress
}

方法2:手动指定上层OU名称列表遍历

如果上层OU的数量不多且名称明确,可以直接把它们放进数组里循环,更简单直接:

# 定义需要遍历的上层OU名称数组
$upperOUNames = @("North", "South", "East", "West")

foreach ($ouName in $upperOUNames) {
    # 拼接完整的LDAP路径
    $searchBase = "OU=USERS,OU=Site,OU=$ouName,DC=domain"
    
    Get-ADUser -Filter * -Properties EmailAddress, DisplayName -SearchBase $searchBase -Server ServerName | 
        Select-Object DisplayName, EmailAddress
}

为什么原来的方法行不通?

  • LDAP的搜索路径(SearchBase)必须是完整且有效的DN(可分辨名称),不支持OU=*这种通配符写法,所以会触发语法错误。
  • 你的脚本里的$_没有处于有效的循环上下文(比如ForEach-Object或者foreach循环),所以它不会自动指代上层OU。

额外小技巧

如果需要把结果保存到文件,可以在Select-Object后面加上导出CSV的命令(记得加-Append避免覆盖):

Select-Object DisplayName, EmailAddress | 
    Export-Csv -Path "AllUSUsers.csv" -Append -NoTypeInformation -Encoding UTF8

内容的提问来源于stack exchange,提问作者PowershellMeddler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:57:45