如何使用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
相关产品推荐
相关产品推荐

