Src/Private/Get-ADObjectList.ps1
|
function Get-ADObjectList { param ( [Parameter(Mandatory = $true)] [string]$Domain, [Parameter(Mandatory = $false)] [string]$Server, [Parameter(Mandatory = $false)] [ValidateSet("Users", "Computers", "Groups", "DomainControllers", "GPOs", "OUs")] [string[]]$Object ) [System.Collections.Generic.List[PSObject]]$adObjects = New-Object System.Collections.Generic.List[PSObject] $searcher = New-Object System.DirectoryServices.DirectorySearcher $ConstructedDomainName = "DC=" + $Domain.Split(".") $ConstructedDomainName = $ConstructedDomainName -replace " ", ",DC=" if ($Server) { $searcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$Server/$ConstructedDomainName", $Credential.UserName, $Credential.GetNetworkCredential().Password) } else { $searcher.SearchRoot = "LDAP://$ConstructedDomainName" } $searcher.PageSize = 1000 $searcher.PropertiesToLoad.Add("*") | Out-Null $searcher.SearchScope = "Subtree" # Construct the LDAP filter based on the -Collect parameter $filters = @() foreach ($item in $Object) { switch ($item) { "Users" { $filters += "(objectCategory=person)" } "Computers" { $filters += "(objectCategory=computer)" } "Groups" { $filters += "(objectCategory=group)" } "DomainControllers" { $filters += "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))" } "OUs" { $filters += "(objectCategory=organizationalUnit)" } "GPOs" { $filters += "(objectClass=groupPolicyContainer)" } } } # Combine the filters with an OR if multiple categories are specified $searcher.Filter = if ($filters.Count -gt 1) { "(|" + ($filters -join "") + ")" } else { $filters[0] } $results = $searcher.FindAll() foreach ($result in $results) { $properties = $result.Properties $obj = New-Object PSObject foreach ($propertyName in $properties.PropertyNames) { $value = if ($properties[$propertyName].Count -eq 1) { $properties[$propertyName][0] } else { $properties[$propertyName] } $obj | Add-Member -NotePropertyName $propertyName -NotePropertyValue $value } $obj | Add-Member -NotePropertyName "domain" -NotePropertyValue $Domain $adObjects.Add($obj) } $searcher.Dispose() return $adObjects } |