powershell - 遍历嵌套的 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
解决方案
我们通过创建一个获取 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
}
推荐阅读
- ios - 如何使用 tableView 和 Realm 创建和保存一对多关系(父子)
- multithreading - 像特斯拉的 AutoPilot 这样的系统如何跟上不断变化的多进程请求?
- spring-boot - 使用 Eureka 服务器时出现“Whitelabel 错误页面”
- c - 创建隧道时需要“maxfd”吗?
- angular - 添加 FormGroup 后,Angular observable 更新得太早了
- javascript - 在文件浏览器中单击“打开”时如何提交照片上传
- c# - 为什么会发生这种异常?(任务取消异常)
- html - 如何更改循环创建的每个 div 的背景颜色?
- c++ - 直接从另一个类 c++ 使用对象
- cuda - CUDA cudaMemcpyFromSymbol“无效的设备符号”错误?