Query Active Directory with PowerShell

1 minute read

This function queries Active Directory for users matching the specified parameter and generates a PSObject with certain properties from the returned objects. The collection of returned objects can be piped to additional PowerShell cmdlets for sorting, formatting or exporting.

Function QueryAD

    Function GetUserInfo

            $output = New-Object PSObject
            $output | Add-Member -type NoteProperty -name Last -value $last
            $output | Add-Member -type NoteProperty -name First -value $first
            $output | Add-Member -type NoteProperty -name Initials -value $initials
            $output | Add-Member -type NoteProperty -name Company -value $company
            $output | Add-Member -type NoteProperty -name Office -value $office
            $output | Add-Member -type NoteProperty -name Address -value $address
            $output | Add-Member -type NoteProperty -name City -value $city
            $output | Add-Member -type NoteProperty -name State -value $state
            $output | Add-Member -type NoteProperty -name Zip -value $zip
            $output | Add-Member -type NoteProperty -name Country -value $country
            $output | Add-Member -type NoteProperty -name Phone -value $phone
            $output | Add-Member -type NoteProperty -name Title -value $title
            $output | Add-Member -type NoteProperty -name Department -value $department

    $searcher = New-Object DirectoryServices.DirectorySearcher
    $searcher.Filter = "(&(objectcategory=person)(objectclass=user)($field=$value))"
    $results = $searcher.FindAll() | Sort-Object @{Expression={$_.Properties.sn}}

    ForEach ($user in $results)
            GetUserInfo `
                $user.properties.sn `
                $user.properties.givenname `
                $user.properties.initials `
                $user.properties.company `
                $user.properties.physicaldeliveryofficename `
                $user.properties.streetaddress `
                $user.properties.l `
                $user.properties.st `
                $user.properties.postalcode `
                $user.properties.c `
                $user.properties.telephonenumber `
                $user.properties.title `

The script can be called, the function placed in a profile or the script can be dot-sourced, to allow the ExportGAL function to be called like another cmdlet:

PS C:\> . .\QueryAD.ps1

The function accepts two parameters, a field and a value. These are used to build the search query. For example, the following will search for anyone with the last name of Smith:

PS C:\> QueryAD sn Smith

Building a collection of everyone in the SouthEast Marketing department could be done with this:

PS C:\> QueryAD department "SouthEast Marketing"

The collection of objects can be manipulated just like any other object:

PS C:\> QueryAD department "SouthEast Marketing" | Select-Object last,phone | Format-Table -AutoSize
PS C:\> QueryAD department "SouthEast Marketing" | ConvertTo-Html | Out-File c:\marketing.html
PS C:\> QueryAD department "SouthEast Marketing" | Export-Csv c:\marketing.csv