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
}