获取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
相关产品推荐
相关产品推荐

