我正在使用名为Get-ADdirectReports的函数,该函数以递归方式抓取向特定经理报告的所有用户(如果经理负责多个团队,则包括其他经理及其团队成员)。我正在尝试返回所有AD用户,看看他们是否以递归方式向定义的经理报告。
代码
$Manager = Get-ADdirectReports -SamAccountName "ManagerName" | Select SamAccountName
$Users = Get-AdUser -Filter * -Properties * | Select SamAccountName
Foreach ($User in $Users) {
If ($User -Contains $Manager) {Write-Host $User reports to $Manager}
Else
{$User doesn't report to $Manager}
}
答案 0 :(得分:1)
并不是您想要的东西,但是我猜仍然值得尝试
function GetADUserManagerRecursive {
param (
$Identity
)
$UserAD = Get-ADUser $Identity -Properties Manager
$DirectManager = $UserAD.Manager
$DirectManager = Get-ADUser -Identity $DirectManager -Properties Manager
Write-Output $DirectManager.DistinguishedName
if ( $DirectManager.Manager -ne $UserAD.DistinguishedName ) {
GetADUserManagerRecursive -Identity $DirectManager
}
}
完成后,您可能希望递归获取特定用户的所有危险,将其保存在变量中,然后检查变量中是否有管理者:
$managers = GetADUserManagerRecursive -Identity user
$managers = $managers | select -unique
(Get-ADUser bossname ).SamaccountName -match $managers.SamaccountName
PS请注意,您可能需要将$DirectManager.Manager -ne $UserAD.DistinguishedName
更改为$DirectManager.Manager -ne $null
。
我见过一些公司,最高的老板一直是他自己的经理
答案 1 :(得分:0)
好的,所以这不是最优雅的,当然不是最快的方法,但它应该做你想要的。
function Get-ADTopLevelManager{
param(
$identity
)
$result = New-Object System.Collections.ArrayList
$manager = Get-ADUser $identity -Properties Manager
$result.Add($manager) | Out-Null
$managerDN = $manager.Manager
while($manager -ne $null){
$manager = $null
$manager = Get-AdUser -Filter {DistinguishedName -eq $managerDN} -Properties Manager
$managerDN = $manager.Manager
if($manager.SamAccountName -eq $result[-1].SamAccountName){
$manager = $null
}else{
$result.Add($manager) | Out-Null
}
}
$result
}
$allUsers = New-Object System.Collections.ArrayList
foreach($adUser in Get-AdUser -Filter *){
$temp = New-Object PSCustomObject -Property @{'User' = $adUser.SamAccountName; 'Managers' = Get-ADTopLevelManager $adUser.SamAccountName}
$allUsers.Add($temp) | Out-Null
}
所以此时你有一组对象,它们将任何给定用户链接到他们所有的经理。因此,假设您想知道用户在任何地方的命令链中有哪些用户:
$allUsers | Where-Object{$_.Managers -Contains Manager1}
或者,如果您想知道用户User1的直接经理:
($allUsers | Where-Object{$_.User -eq User1}).Managers[0]
或者,如果您想了解User1的顶级经理:
($allUsers | Where-Object{$_.User -eq User1}).Managers[-1]