从多个Active Directory组读取用户并排序分组的实现需求
我来帮你搞定这个从AD组提取用户并筛选首个排序组的需求!先把需求再明确下:
需求说明:从指定的Active Directory组中读取用户信息,对每个用户的所有所属组按字母数字排序后,只保留第一个组,最终输出每个用户对应的这个组。
示例输入:
UserName UserGroup
UZZ GAA
UKK GAA
UZZ GBB
ULL GBB
期望输出:
Username UserGroup
UKK GAA
ULL GBB
UZZ GAA
下面是完善后的完整PowerShell代码,我会一步步给你解释关键逻辑:
完整实现代码
# 导入ActiveDirectory模块(确保你的环境已安装AD模块) Import-Module ActiveDirectory # 获取所有名称匹配"G-Q-T*"的AD组,只提取组名 $targetGroups = Get-AdGroup -Filter * | Where-Object {$_.Name -like "G-Q-T*"} | Select-Object -ExpandProperty Name # 用哈希表存储每个用户的所有所属组,键是用户名,值是组名列表 $userGroupMap = @{} # 遍历每个目标组,收集组内用户及其所属组 foreach ($group in $targetGroups) { # 获取当前组内的所有用户(排除组、计算机等对象) $groupUsers = Get-AdGroupMember -Identity $group | Where-Object {$_.objectClass -eq "user"} | Select-Object -ExpandProperty SamAccountName foreach ($user in $groupUsers) { # 如果哈希表中还没有这个用户,就初始化一个空列表 if (-not $userGroupMap.ContainsKey($user)) { $userGroupMap[$user] = @() } # 把当前组添加到该用户的组列表中 $userGroupMap[$user] += $group } } # 处理每个用户的组列表:排序后取第一个,生成结果对象 $finalResult = $userGroupMap.GetEnumerator() | ForEach-Object { # 对用户的组列表按字母数字排序 $sortedGroups = $_.Value | Sort-Object # 构造自定义对象,存储用户名和首个排序后的组 [PSCustomObject]@{ Username = $_.Key UserGroup = $sortedGroups[0] } } # 按用户名排序后输出,用Format-Table保证格式美观 $finalResult | Sort-Object Username | Format-Table -AutoSize
关键逻辑说明
- 哈希表存用户组:用
$userGroupMap哈希表来统一收集每个用户的所有所属组,这样能避免重复记录用户,也方便后续处理每个用户的组列表。 - 筛选用户对象:在获取组成员时,用
Where-Object {$_.objectClass -eq "user"}排除组、计算机等非用户对象,确保只处理真正的AD用户。 - 排序取首个组:对每个用户的组列表用
Sort-Object做字母数字排序,直接取索引[0]的元素就是排序后的第一个组,完全符合你的需求。 - 格式化输出:最后把结果转成自定义对象,按用户名排序后用
Format-Table输出,和你给出的示例格式完全匹配。
测试一下示例场景:比如用户UZZ属于GAA和GBB,排序后GAA在前,所以最终输出UZZ对应GAA,和示例期望的结果一致~
内容的提问来源于stack exchange,提问作者frigo
相关产品推荐
相关产品推荐

