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

合并PowerShell脚本:检查指定用户是否同时属于多个AD组

合并PowerShell脚本:检查指定用户列表是否同时属于多个AD组

需求说明

针对给定的用户列表,逐个验证每个用户是否同时属于指定的Active Directory组(例如User1需同时在Group1和Group2中、User3需同时在Group1和Group3中等),现有两个仅实现部分功能的脚本,需合并为一个完整脚本。

原有独立脚本

脚本1:检查用户列表是否属于单个AD组

$users = Get-Content C:\temp\user_list.txt
$group = "group1"
$members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty samaccountname
ForEach ($user in $users) {
    If ($members -contains $user) {
      Write-Host "$user"
    }
}

脚本2:找出同时属于两个AD组的用户

# 对比两个指定组,返回同时在两个组中的用户
# 获取Group1的成员
$group1 = get-adgroupmember "group1";
 
# 获取Group2的成员
$group2 = get-adgroupmember "group2";
 
  
# 遍历Group1中的每个用户
foreach ($group1user in $group1){
 
    # 对Group1中的每个用户,遍历Group2的所有用户寻找匹配项
    foreach ($group2user in $group2){
 
        # 如果找到匹配
        if ($group1user.samaccountname -eq $group2user.samaccountname) {
            write-host $group1user.samaccountname;
        }
    }
}

合并后的完整脚本

# 配置参数:修改为你的实际路径和目标组
$userListPath = "C:\temp\user_list.txt"
$targetGroups = @("Group1", "Group2") # 可根据需求添加更多组,例如@("Group1", "Group3")

# 读取用户列表
$users = Get-Content $userListPath

# 预加载所有目标组的成员列表,存入哈希表提升查询效率
$groupMemberMap = @{}
foreach ($group in $targetGroups) {
    # 递归获取组内所有成员(包括嵌套组)
    $memberSams = Get-ADGroupMember -Identity $group -Recursive | Select-Object -ExpandProperty samaccountname
    $groupMemberMap[$group] = $memberSams
}

# 逐个检查用户是否同时属于所有目标组
foreach ($user in $users) {
    $meetsRequirement = $true
    foreach ($group in $targetGroups) {
        # 如果用户不在当前组中,直接标记为不符合并跳出循环
        if (-not $groupMemberMap[$group] -contains $user) {
            $meetsRequirement = $false
            break
        }
    }

    # 输出结果
    if ($meetsRequirement) {
        Write-Host "✅ $user 同时属于所有指定组"
    } else {
        Write-Host "❌ $user 未同时属于所有指定组"
    }
}

脚本优势

  • 灵活扩展:只需修改$targetGroups数组即可添加任意数量的检查组,无需调整核心逻辑
  • 高效查询:一次性预加载所有组的成员列表,避免重复访问AD;使用哈希表存储成员,查询速度更快
  • 结果直观:明确标记每个用户的检查状态,便于快速查看

扩展:针对不同用户检查不同组

如果需要为每个用户指定不同的检查组,可以将用户列表改为CSV格式(例如user_checks.csv),内容示例:

SamAccountName,CheckGroups
User1,Group1;Group2
User2,Group1;Group2
User3,Group1;Group3

对应的脚本调整如下:

$userCsvPath = "C:\temp\user_checks.csv"

# 读取CSV文件
$userChecks = Import-Csv $userCsvPath

# 预加载所有可能用到的组的成员列表
$allGroups = $userChecks.CheckGroups -split ";" | Select-Object -Unique
$groupMemberMap = @{}
foreach ($group in $allGroups) {
    $memberSams = Get-ADGroupMember -Identity $group.Trim() -Recursive | Select-Object -ExpandProperty samaccountname
    $groupMemberMap[$group.Trim()] = $memberSams
}

# 逐个检查用户
foreach ($entry in $userChecks) {
    $user = $entry.SamAccountName
    $checkGroups = $entry.CheckGroups -split ";" | ForEach-Object { $_.Trim() }
    
    $meetsRequirement = $true
    foreach ($group in $checkGroups) {
        if (-not $groupMemberMap[$group] -contains $user) {
            $meetsRequirement = $false
            break
        }
    }

    Write-Host "$user 检查结果:$(if ($meetsRequirement) {'符合'} else {'不符合'})"
}

内容的提问来源于stack exchange,提问作者David Borough

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:46:18