functions/get-admanager.ps1
Function Get-ADManager { [cmdletbinding()] [OutputType("ADManager")] Param( [parameter(Position = 0, HelpMessage = "Enter an AD user SAMAccountname")] [validatenotnullorEmpty()] [string]$Name, [Parameter(HelpMessage = "Specify what managed detail you want.")] [ValidateSet("All", "DirectReports", "ManagedObjects")] [string]$Detail = "All", [Parameter(HelpMessage = "Specify what managed object class you want. The default is everything. This parameter has no effect if you only get Direct Reports.")] [ValidateSet("All", "Group", "Computer", "OU")] [string[]]$ObjectClass = "All", [Parameter(HelpMessage = "Enter the distinguished name of the top level container or organizational unit.")] [ValidateNotNullOrEmpty()] [string]$SearchBase, [Parameter(HelpMessage = "Specify a domain controller to query for a list of domain controllers.")] [alias("dc", "domaincontroller")] [string]$Server, [Parameter(HelpMessage = "Specify an alternate credential. This will be used to query the domain and all domain controllers.")] [alias("RunAs")] [PSCredential]$Credential ) Write-Verbose "[$((Get-Date).TimeofDay)] Starting $($MyInvocation.MyCommand)" #set some default parameter values $params = "Credential", "Server" ForEach ($param in $params) { if ($PSBoundParameters.ContainsKey($param)) { Write-Verbose "[$((Get-Date).TimeofDay)] Adding 'Get-AD*:$param' to script PSDefaultParameterValues" $script:PSDefaultParameterValues["Get-AD*:$param"] = $PSBoundParameters.Item($param) } } #foreach $properties = "Title", "Description", "DisplayName", "Enabled" Switch ($Detail) { "DirectReports" { $properties += "DirectReports" } "ManagedObjects" { $properties += "ManagedObjects" } "All" { $properties += "ManagedObjects", "DirectReports" } } $get = @{ Filter = "" Properties = $properties ErrorAction = "Stop" } if ($Name) { Write-Verbose "[$((Get-Date).TimeofDay)] Searching for user $Name" $get.Filter = "name -eq '$Name'" } else { Write-Verbose "[$((Get-Date).TimeofDay)] Searching for any manager" $get.filter = "DirectReports -like '*' -OR ManagedObjects -like '*'" } if ($SearchBase) { Write-Verbose "[$((Get-Date).TimeofDay)] Limiting search to $SearchBase" $get.Add("SearchBase", $SearchBase) } Try { $managers = Get-ADUser @get } Catch { Write-Warning $_.Exception.Message } if ($managers.name) { Write-Verbose "[$((Get-Date).TimeofDay)] Found $($managers.name.count) manager(s)" $results = [System.Collections.Generic.list[Object]]::new() foreach ($manager in $managers) { Write-Verbose "[$((Get-Date).TimeofDay)] $($manager.distinguishedname)" Write-Verbose "[$((Get-Date).TimeofDay)] Processing DirectReports" $direct = $manager.DirectReports | Get-ADUser -Properties Title, Description, Department, DisplayName, Enabled | Sort-Object -Property DistinguishedName | ForEach-Object { [pscustomobject]@{ PSTypeName = "ADDirect" DistinguishedName = $_.DistinguishedName Name = $_.Name DisplayName = $_.DisplayName Title = $_.Title Description = $_.Description Department = $_.Department Enabled = $_.Enabled SamAccountName = $_.SamAccountname } } Write-Verbose "[$((Get-Date).TimeofDay)] Processing Managed Objects" $managed = Foreach ($item in $manager.managedObjects) { $adobj = Get-ADObject -Identity $item Switch ($adobj.ObjectClass) { "group" { if ($ObjectClass -contains "All" -OR $ObjectClass -contains "Group") { Write-Verbose "[$((Get-Date).TimeofDay)] Getting managed group $item" $grp = Get-ADGroup -Identity $item -Properties GroupScope, GroupCategory, Description [pscustomobject]@{ PSTypeName = "ADManaged.$($adobj.ObjectClass)" DistinguishedName = $adobj.DistinguishedName Name = $adobj.Name Class = $adobj.objectClass Scope = $grp.GroupScope Category = $Grp.GroupCategory Description = $grp.Description } } } "computer" { if ($ObjectClass -contains "All" -OR $ObjectClass -contains "Computer") { Write-Verbose "[$((Get-Date).TimeofDay)] Getting managed computer $item" $member = Get-ADComputer -Identity $item -Property OperatingSystem, IPv4Address, Enabled, Description, Location, DNSHostName [pscustomobject]@{ PSTypeName = "ADManaged.$($adobj.ObjectClass)" DistinguishedName = $adobj.DistinguishedName Name = $adobj.Name DNSHostName = $member.DNSHostName Class = $adobj.objectClass OperatingSystem = $member.OperatingSystem Description = $member.Description IPAddress = $member.IPv4Address Location = $member.Location Enabled = $member.Enabled } } } "OrganizationalUnit" { if ($ObjectClass -contains "All" -OR $ObjectClass -contains "OU") { Write-Verbose "[$((Get-Date).TimeofDay)] Getting managed OU $item" $ou = Get-ADOrganizationalUnit -Identity $item -Properties ProtectedFromAccidentalDeletion, Description [pscustomobject]@{ PSTypeName = "ADManaged.$($adobj.ObjectClass)" DistinguishedName = $adobj.DistinguishedName Name = $adobj.Name Class = $adobj.objectClass Description = $ou.Description Protected = $ou.ProtectedFromAccidentalDeletion } } } } } #foreach item $mgr = [pscustomobject]@{ PSTypeName = "ADManager" DistinguishedName = $manager.Distinguishedname Name = $Manager.name SamAccountName = $Manager.SamAccountName DisplayName = $manager.DisplayName Title = $Manager.Title Description = $manager.Description DirectReports = $Direct ManagedObjects = $managed | Sort-Object -Property Class, DistinguishedName Enabled = $manager.Enabled } if ($Detail -eq "All") { $results.Add($mgr) } elseif ($detail -eq "DirectReports" -AND $mgr.DirectReports.count -gt 0) { $results.Add($mgr) } elseif ($detail -eq "ManagedObjects" -AND $mgr.ManagedObjects.count -gt 0) { $results.Add($mgr) } } #foreach manager $results } #if managers else { Write-Warning "No matching user(s) found." } Write-Verbose "[$((Get-Date).TimeofDay)] Ending $($MyInvocation.MyCommand)" } |