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