VBA LDAP查询无法返回用户所有所属组的问题求助
解决AD用户所属组查询不全的问题
我之前也踩过类似的坑——明明用户确实在Domain Users组里,但查询结果就是不显示,大概率是因为Domain Users是这个用户的主组(Primary Group),而常规的MemberOf查询不会返回主组信息,主组是存在用户对象的primaryGroupID属性里的,不是MemberOf集合的一部分。
咱们一步步来解决:
1. 先确认问题根源
如果你用的是类似这样的PowerShell命令:
Get-ADUser Kyle -Properties MemberOf | Select-Object -ExpandProperty MemberOf
这个命令只会返回用户直接加入的组,而主组(比如默认的Domain Users)不会出现在MemberOf里,必须单独查询。
2. 基础解决方案:包含主组的查询
用这段脚本可以同时获取直接组和主组:
# 获取用户对象,同时拉取MemberOf和primaryGroupID属性 $targetUser = Get-ADUser Kyle -Properties MemberOf, primaryGroupID # 获取所有直接所属的组 $directGroups = $targetUser.MemberOf | Get-ADGroup # 通过primaryGroupID匹配主组 $primaryGroup = Get-ADGroup -Filter "primaryGroupID -eq $($targetUser.primaryGroupID)" # 合并并输出所有组名 ($directGroups + $primaryGroup) | Select-Object Name
运行这个就能看到Domain Users和RDOC Group了。
3. 进阶:如果还有嵌套组需要查询
如果用户还通过嵌套组间接加入了其他组(比如RDOC Group属于某个父组,用户间接继承),上面的脚本还是会漏。这时候可以用递归函数来获取所有直接+间接+主组:
# 递归获取组的所有嵌套父组 function Get-NestedADGroups { param( [Microsoft.ActiveDirectory.Management.ADGroup]$Group ) $nestedGroups = $Group.MemberOf | Get-ADGroup -Properties MemberOf foreach ($nestedGroup in $nestedGroups) { $nestedGroup Get-NestedADGroups -Group $nestedGroup } } # 获取用户的所有所属组(直接+间接+主组) function Get-AllUserGroups { param( [string]$Username ) $user = Get-ADUser $Username -Properties MemberOf, primaryGroupID # 获取主组 $primaryGroup = Get-ADGroup -Filter "primaryGroupID -eq $($user.primaryGroupID)" $allGroups = @($primaryGroup) # 获取直接组及其嵌套父组 foreach ($groupDN in $user.MemberOf) { $directGroup = Get-ADGroup $groupDN -Properties MemberOf $allGroups += $directGroup $allGroups += Get-NestedADGroups -Group $directGroup } # 去重后返回组名 $allGroups | Select-Object -Unique Name } # 调用函数查询Kyle的所有组 Get-AllUserGroups -Username Kyle
额外排查点
- 可以先验证Domain Users的primaryGroupID:
Get-ADGroup "Domain Users" | Select-Object primaryGroupID,然后对比Kyle用户的primaryGroupID是否一致,确认它确实是主组。 - 如果用的是其他工具(比如第三方AD查询工具),检查工具设置里是否有“包含主组”或“显示所有组”的选项,可能默认没开启。
内容的提问来源于stack exchange,提问作者Tchotchke
相关产品推荐
相关产品推荐

