我需要帮助弄清楚使用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
答案 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
}