首页 > 解决方案 > 遍历嵌套的 AD 组,直到找到所有成员

问题描述

我需要帮助找出循环通过 Active Directory 安全组以使用 Get-ADGroupMember 查找任何嵌套组的所有成员的逻辑。如果我在该 cmdlet 上使用递归开关,它不会捕获嵌套组的名称,而只会捕获成员。我需要捕捉一切。我觉得这需要使用一段时间或 do/while 来完成。

这部分代码让我大部分时间都在那里。但是,如果 objectclass 是 User,我不知道如何阻止它在 while 内运行 Get-AdGroupMember。我正在使用名为“testgroup1”、“testgroup2”、“testgroup3”和“testgroup4”的 4 个 AD 组进行测试。Testgropus 1,2 和 3 每个都有一个用户作为成员。Testgroup2 是 Testgroup1 的成员。Testgroup3 是 Testgroup2 的成员。Testgroup4 是 Testgroup 3 的成员,它也有 4 个用户作为成员。

$groups = Get-ADGroupMember 'testgroup1'
$allGroups =$null

While($groups){
    $allGroups += $groups.SamAccountName
    $groups = $groups.SamAccountName | Get-ADGroupMember 
}

$allGroups

标签: powershell

解决方案


我们通过创建一个获取 AD 组成员并仅将用户添加到数组的函数来解决此问题。如果对象类作为一个组返回,它会在该新组上再次调用相同的函数,然后将其下的用户添加到同一个数组中。代码如下。

function Get-MBusers {
Param (
    $Group,
    $adserver
)

$users=@()    

$members = Get-Adgroup -Identity $Group -Server $adserver -Properties members | Select-Object -ExpandProperty Members | Where-Object {$_ -notmatch "ForeignSecurityPrincipals"}  | ForEach-Object {Get-ADObject $_ -Server $adserver}
foreach ($member in $members) {
    Write-Debug "$($member.Name)"

    $type = Get-ADObject $member -server $ADServer -Properties samAccountname

    if ($type.ObjectClass -eq 'user') {
        $users += Get-Aduser $type.samaccountname -Server $ADServer
    }

    # If it's a group
    if ($type.ObjectClass -eq 'group') {
        Write-Debug "Breaking out group $($type.Name)"
        $users += Get-MBUsers $member $adserver
    }

}    

return $users

}


推荐阅读