Today on PowerShell.org, I found an IT Pro who needed to find a way to associate a manger not only with their immediate subordinates, but also the subordinates of their subordinates. Here is what I came up with.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | Function Get-SubordinateData { Param ( [Microsoft.ActiveDirectory.Management.ADUser[]] $UserList
)
Function New-ManagerData { $Obj = New-Object -TypeName PSObject -Property @{ "UserName" = $Null "DistinguishedName" = $Null "DirectReports" = @() "DRNames" = @() "Manager" = $Null } $obj.PSObject.TypeNames.Insert(0,'ManagerSubordinateData') Write-Output $Obj
}
Function New-DRName { Param ($Name) $Obj = New-Object -TypeName PSObject -Property @{ "Name" = $Name } Write-Output $Obj }
# Create a dynamic array to hold all of the objects to # be sent to the pipeline. $UserArray = @()
# Do the initial population of the ManagerSubordinateData # Objects ForEach ($U in $UserList) { $Obj = New-ManagerData $Obj.UserName = $U.Name $Obj.DistinguishedName = $U.DistinguishedName $Obj.Manager = $U.Manager
$UserArray += $Obj
}
# Cycle through all of the user objects passed to this function # and add subordinate data to the managers. For ($X = 0; $X -lt $UserList.count; $X++) { # If a User Object has a manager, process it. If ($UserList[$X].Manager) {
# Get the Distinguished Name of the user's manager. $UserManager = $UserArray | Where-Object DistinguishedName -eq $UserList[$X].Manager
# Assign that manager the Distinguished name and the Name of # the subordinate in the ManagerSubordinateData object. $UserArray | Where DistinguishedName -eq $UserManager.DistinguishedName | ForEach-Object { $_.DirectReports += New-DRName -Name "$($UserList[$X].DistinguishedName)" $_.DRNames += New-DRName -Name "$($UserList[$X].Name)" } } }
# Write the data to the pipeline. Write-output $UserArray
<# .SYNOPSIS Returns all the subordinates of a manager.
.DESCRIPTION Uses Active Directory to associate managers to their subordinates.
.PARAMETER UserList A list of Active Directory User Objects to process for manager/subordinate relationships. You must include the extended property of "Manager". The Get-ADUser cmdlet will not include this propertyt by default. See the Example section.
.EXAMPLE Get-SubordinateData -UserList (Get-ADUser -filter * -Properties Manager) Returns object that associate a mangers Dinstinguish Name with there Distinguished Names pf their subordinates.
NOTES Requires access to the Active Directory Module.
#> }
|
Comments