PowerShell中的Manager报告

时间:2018-03-19 18:29:43

标签: powershell

我正在使用名为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}
}

2 个答案:

答案 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]