遍历嵌套的广告组,直到找到所有成员

时间:2019-09-04 15:39:48

标签: powershell

我需要帮助弄清楚使用Get-ADGroupMember遍历Active Directory安全组以查找任何嵌套组的所有成员的逻辑。如果我在该cmdlet上使用递归开关,则它不会捕获嵌套组的名称,而不会捕获成员。我需要捕捉一切。我觉得这需要使用一阵子或do / while来完成。

这部分代码为我提供了大部分帮助。但是,如果对象类是User,我无法弄清楚如何防止它在while内运行Get-AdGroupMember。我正在测试4个AD组,分别是“ testgroup1”,“ testgroup2”,“ testgroup3”和“ testgroup4”。 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

1 个答案:

答案 0 :(得分:1)

我们通过创建一个函数来解决此问题,该函数获取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

}