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

从多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:50