我的脚本正在访问事件目录以提取 AD 组及其子组。
我将添加 Get-ADGroupMember Where-Object { $_.ObjectClass -eq "user" })
到脚本,但现在脚本无休止地运行。
我检查了 CSV 文件并且数据正在被推送到其中,我只是不知道为什么它会无休止地运行。
我还是 Powershell 的新手,可能忽略了一些东西。
我是否需要添加某种 catch
或 exit
?我读到 exit
在循环完全执行之前关闭循环。
我的脚本:
Clear-Host
#Import-Module ActiveDirectory
Write-Host -ForegroundColor Green "Starting"
$logfile = "C:\temp\logfile.csv"
"Domains,Groups,Nested" | Add-Content $logfile
$grp_list = Import-Csv "C:\temp\Copy_lp.csv"
$domains = @()
$dom = Import-Csv "C:\temp\Copy_lp.csv" |
Select-Object -Unique -ExpandProperty "Domain Group"
foreach ($domain in $dom) {
$domains += $domain.Split('\')[0]
}
$domains = $domains | Select-Object -Unique
foreach ($domain in $domains) {
Write-Host "Domain:" $domain
Get-ADGroup -Filter * -Server $domain |
ForEach-Object {
$group = $_.Name
$grps = (Get-ADGroupMember $group -Server $domain |
Where-Object { $_.ObjectClass -eq "Group" })
$grps | ForEach {
Write-Host "Group: " $_.Name
"$domain,$($_.Name),$group" | Add-Content $logfile
}
}
}
Write-Host -ForegroundColor Green "Done"
更新
托默回答了这个问题。我从以前执行的脚本中获取了输出 CSV,该脚本用于查看数据库级别的用户权限。所以当一个用户被映射到实例内的多个数据库(用户也属于不同的组和子组)时,会出现很多次。因此,当我的脚本遍历列表时,它会一遍又一遍地重新运行相同的 AD 组。我仍然不明白为什么它会持续运行,但是一旦我将 CSV 文件更改为只执行一个域列表并吐出我正在寻找的输出。我没有把这个作为答案,因为我觉得 Tomer 值得称赞。感谢大家的帮助。
最佳答案
在 Active Directory 中,允许成员自循环。因此,例如,A 组可能包含另一个 B 组,该 B 组可能再次包含 A 组。因此,简单枚举member-of关系会导致无限循环。
解决这个问题的一个简单方法是存储您已经看到的 DN,并且不再重复它们。
关于Powershell 拉取 AD 组和子组无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510761/