如何用PowerShell获取指定人员的直接及间接下属?
解决Azure AD中获取指定用户所有直接/间接下属的问题
你当前的脚本仅处理了两层下属(目标用户的直接下属,以及这些下属的直接下属),要遍历所有层级的下属,需要用迭代队列的方式循环处理,直到没有更多下属为止。下面是修改后的完整脚本:
$name = Read-Host -Prompt "Name: " $targetUser = Get-AzureADUser -SearchString $name # 初始化结果集合和待处理队列 $allSubordinates = @() $processingQueue = New-Object System.Collections.Queue # 先获取目标用户的直接下属,过滤掉服务账号,加入结果和队列 $directReports = Get-AzureADUserDirectReport -ObjectID $targetUser.ObjectId | Where-Object { $_.UserPrincipalName -notlike "*svc*" -and $_.UserPrincipalName -notlike "SVC*" } $allSubordinates += $directReports foreach ($report in $directReports) { $processingQueue.Enqueue($report) } # 循环处理队列中的用户,直到队列为空 while ($processingQueue.Count -gt 0) { $currentUser = $processingQueue.Dequeue() # 获取当前用户的直接下属 $subReports = Get-AzureADUserDirectReport -ObjectID $currentUser.ObjectId -ErrorAction Ignore | Where-Object { $_.UserPrincipalName -notlike "*svc*" -and $_.UserPrincipalName -notlike "SVC*" } # 添加到结果集合 $allSubordinates += $subReports # 将这些下属加入队列,继续处理他们的下属 foreach ($sub in $subReports) { $processingQueue.Enqueue($sub) } } # 输出所有下属 $allSubordinates
关键逻辑说明
- 使用
System.Collections.Queue跟踪需要处理的用户,确保每一层下属都会被逐层处理 - 每次从队列中取出一个用户,获取其下属并过滤服务账号后,将结果加入总集合,同时把这些下属放入队列等待后续处理
- 循环直到队列清空,此时已遍历完所有层级的下属(包括Bob→Eason→George→Harris这类多层级关系)
原脚本失效原因
你之前的脚本仅做了两次遍历:第一次取目标用户的直接下属,第二次取这些下属的直接下属,但没有继续处理George的下属Harris。而队列迭代的方式会持续处理每一个新发现的下属,直到没有更多层级为止。
内容的提问来源于stack exchange,提问作者ynnaij
相关产品推荐
相关产品推荐

