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

使用PowerShell实现对象相等比对及查询指定用户共同所属的Active Directory组

1. 使用PowerShell比较两个对象并输出相等内容

要找出两个对象集合里的共同内容,最常用的工具是Compare-Object cmdlet,关键是加上-IncludeEqual参数,然后筛选出两侧都存在的条目。

举两个常见场景的例子:

场景1:比较简单数组的共同元素

# 定义两个测试数组
$firstSet = @("Apple", "Banana", "Cherry")
$secondSet = @("Banana", "Cherry", "Date")

# 比较并提取相等的元素
Compare-Object -ReferenceObject $firstSet -DifferenceObject $secondSet -IncludeEqual | 
    Where-Object { $_.SideIndicator -eq "==" } | 
    Select-Object -ExpandProperty InputObject

这段代码会输出Banana和Cherry,也就是两个数组都有的元素。

场景2:比较自定义对象的共同条目

如果是带属性的自定义对象(比如用户信息),可以指定要比较的属性:

# 定义两个用户对象集合
$teamA = [PSCustomObject]@{Name="John"; Age=30}, [PSCustomObject]@{Name="Jane"; Age=28}
$teamB = [PSCustomObject]@{Name="Jane"; Age=28}, [PSCustomObject]@{Name="Bob"; Age=35}

# 比较Name和Age属性,输出完全匹配的对象
Compare-Object -ReferenceObject $teamA -DifferenceObject $teamB -Property Name, Age -IncludeEqual | 
    Where-Object { $_.SideIndicator -eq "==" } | 
    Select-Object Name, Age

这里会输出Jane的用户信息,因为她在两个集合里的属性完全一致。


2. 获取所有用户共同加入的Active Directory组

你的现有代码只是逐个输出每个用户的组,要实现所有用户共同的组,核心思路是先收集每个用户的组,再求它们的交集。我帮你调整了代码,还加了错误处理避免无效用户中断脚本:

# 先导入Active Directory模块(如果还没加载的话)
Import-Module ActiveDirectory -ErrorAction SilentlyContinue

# 读取用户列表文件
$users = Get-Content -Path "C:\users.txt"

# 存储每个用户的组集合
$allUserGroups = @()

foreach ($user in $users) {
    Write-Host "正在获取用户 $user 的组信息..."
    try {
        # 获取当前用户的所有AD组,只提取组名称
        $userGroups = Get-ADPrincipalGroupMembership -Identity $user -ErrorAction Stop | 
            Select-Object -ExpandProperty Name
        $allUserGroups += $userGroups
    } catch {
        # 遇到无效用户或权限问题时给出警告
        Write-Warning "无法获取用户 $user 的组信息:$_"
    }
}

# 计算所有用户组的交集(共同组)
if ($allUserGroups.Count -gt 0) {
    $commonGroups = $allUserGroups[0]
    for ($i = 1; $i -lt $allUserGroups.Count; $i++) {
        $commonGroups = Compare-Object -ReferenceObject $commonGroups -DifferenceObject $allUserGroups[$i] -IncludeEqual | 
            Where-Object { $_.SideIndicator -eq "==" } | 
            Select-Object -ExpandProperty InputObject
        
        # 如果中途交集为空,提前终止循环
        if (-not $commonGroups) { break }
    }

    # 输出结果
    Write-Host "`n所有用户共同加入的组:"
    $commonGroups
} else {
    Write-Warning "没有获取到任何用户的组信息,请检查用户列表或AD权限。"
}

代码逻辑说明:

  1. 导入AD模块:确保能使用Get-ADPrincipalGroupMembership cmdlet
  2. 读取用户列表:从指定文本文件加载用户名
  3. 收集每个用户的组:遍历每个用户,获取他们的组名称并存储,同时处理可能的错误(比如用户不存在)
  4. 求交集:从第一个用户的组开始,依次和后续每个用户的组比较,逐步缩小范围到所有用户都有的组
  5. 输出结果:最后打印所有用户共同的组,如果没有共同组会输出空,或者如果没有有效用户会给出提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:09:10