【问题标题】:See if a any of a list of users, is a member of an AD group查看用户列表中的任何一个是否是 AD 组的成员
【发布时间】:2019-04-30 14:46:44
【问题描述】:

我有一个用户列表和一个 AD 组列表。我想知道,是否有任何用户是这些组的成员。

  • 我不需要知道哪些成员是哪个组的成员。
  • 我只需要知道是否有任何用户匹配组,如果匹配存在 输出找到的匹配和组名。

我有这个代码:

$users = Get-Content C:\test\testusers.csv
$groups = Get-Contect C:\test\testgroups.csv
foreach ($user in $users) {
    foreach ($group in $groups) {
        $members = Get-ADGroupMember -Identity $group -Recursive |
                   Select -ExpandProperty SamAccountName
        if ($members -contains $user) {
            Write-Host "Match Found $group"
        }
    }
}

我已经针对 4 个用户和 3 个广告组进行了测试,而这满足了我的需求。我得到了输出:

  • 匹配找到的组名 1
  • 匹配找到的组名 2
  • 匹配找到的组名 1

我的理解是,这是针对所有组扫描每个用户,然后针对所有组扫描下一个用户。虽然这对我的少量测试批次有效,但我需要针对 1100 个组扫描 2000 个用户。

我认为这是因为我正在根据组扫描用户?并且需要为用户扫描组?

有没有办法让我写一行代码,如果找到就移到下一组?

【问题讨论】:

    标签: powershell active-directory active-directory-group


    【解决方案1】:

    有没有我可以写一行代码,如果找到移动到下一组?

    是的,您可以使用break 关键字来打破foreach 循环。

    但是,我建议以不同的方式解决您的要求。

    我只需要知道是否有任何用户匹配某个组,如果匹配存在则输出 Match found 和组名。

    比在第一次匹配后中断更有效的是始终查询一次组。有不同的选择。一种选择是使用 Compare-Object 来查找属于组成员和输入 CSV 一部分的名称,这正是您所说的匹配。

    $users = Get-Content C:\test\testusers.csv
    $groups = Get-Content C:\test\testgroups.csv
    
    foreach ($group in $groups) {
    
        $members = Get-ADGroupMember -Identity $group -Recursive
    
        if (Compare-Object -ReferenceObject $members.SamAccountName -DifferenceObject $users -ExcludeDifferent -IncludeEqual) {
            $group
        }
    
    }
    

    【讨论】:

    • 好答案。但是,需要检查第二行代码中的拼写:Get-Contect。
    • @Jordan 感谢您的关注。我从原始代码中复制了它:D
    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 2023-04-11
    • 2019-11-02
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多