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

获取OU内所有组及嵌套组中的不重复AD用户邮箱

解决指定OU下嵌套组用户邮箱获取问题

问题分析

你尝试的三个脚本各有问题:

  • 第一个脚本:用户重复显示是因为同一用户可能属于多个组,且未做去重处理;另外$group本身就是ADGroup对象,无需再次调用Get-ADGroup $group;过早使用ft(Format-Table)会将对象转为格式化输出,无法后续进行去重等操作。
  • 第二个脚本:memberOf:1.2.840.113556.1.4.1941:过滤器的目标应该是组的DN,而非OU的DN,所以该逻辑无法匹配到用户,导致无结果。
  • 第三个脚本:仅查询指定OU下的所有对象,未关联组的成员关系,自然无法获取组内的用户。

解决方案

方法一:遍历组后去重(直观易理解)

先获取指定OU下的所有组,再递归获取每个组的成员用户,最后去重并提取邮箱:

$targetOU = 'OU=someOU,DC=someDomain,DC=com'
# 获取指定OU及其子OU下的所有组
$groups = Get-ADGroup -Filter * -SearchBase $targetOU -SearchScope Subtree

$allUsers = @()
foreach ($group in $groups) {
    # 递归获取组及嵌套组的所有用户,同时加载邮箱属性
    $users = Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$($group.DistinguishedName))" -Properties EmailAddress
    $allUsers += $users
}

# 去重、过滤空邮箱并格式化输出
$allUsers | Select-Object -Unique EmailAddress | Where-Object { $_.EmailAddress } | Format-Table -AutoSize

方法二:单查询直接获取(更高效)

通过双层递归LDAP过滤器,直接查询所有属于指定OU下组(含嵌套组)的用户,无需遍历组:

$targetOU = 'OU=someOU,DC=someDomain,DC=com'
# 构造过滤器:用户对象,且属于指定OU下任意组的递归成员
$ldapFilter = "(&
    (objectClass=user)
    (objectCategory=person)
    (memberOf:1.2.840.113556.1.4.1941:=(memberOf:1.2.840.113556.1.4.1941:=$targetOU))
)"

# 获取用户、去重、过滤空邮箱并输出
Get-ADUser -LDAPFilter $ldapFilter -Properties EmailAddress | 
    Select-Object -Unique EmailAddress | 
    Where-Object { $_.EmailAddress } | 
    Format-Table -AutoSize

关键说明

  • -Properties EmailAddress:Get-ADUser默认不返回邮箱属性,必须显式指定才能获取。
  • -Unique:用于去除重复的用户(同一用户属于多个组时只会保留一条)。
  • Where-Object { $_.EmailAddress }:过滤掉未设置邮箱的用户,避免输出空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:30:11