合并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
相关产品推荐
相关产品推荐

