internal/functions/Resolve-ADObject.ps1

function Resolve-ADObject {
    <#
    .SYNOPSIS
        Resolves AD Objects from wildcard-patterned DNs.
     
    .DESCRIPTION
        Resolves AD Objects from wildcard-patterned Distinguished Names.
     
    .PARAMETER Filter
        The wildcard-patterned DN
     
    .PARAMETER Server
        The server / domain to work with.
     
    .PARAMETER Credential
        The credentials to use for this operation.
     
    .PARAMETER ObjectClass
        Only return objects of the specified object class.
        Default: *
     
    .EXAMPLE
        PS C:\> Resolve-ADObject -OUFilter '*,*,OU=Contoso,DC=contoso,DC=com' -ObjectClass user
 
        Resolves all user objects two steps under the Contoso OU.
    #>

    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true, Mandatory = $true)]
        [string]
        $Filter,

        [PSFComputer]
        $Server,

        [PSCredential]
        $Credential,

        [string]
        $ObjectClass = '*'
    )

    begin {
        function Get-AdNextStep {
            [CmdletBinding()]
            param (
                $Parameters,
    
                $Fragments,
    
                $BasePath
            )
    
            $nameFilter = (@($Fragments)[0] -split "=",2)[-1]
            $adObjects = Get-ADObject @Parameters -SearchBase $BasePath -SearchScope OneLevel -LDAPFilter "(name=$nameFilter)"
            if (@($Fragments).Count -eq 1) {
                return $adObjects
            }
    
            foreach ($adObject in $adObjects) {
                Get-AdNextStep -Parameters $Parameters -BasePath $adObject.DistinguishedName -Fragments $Fragments[1..$Fragments.Length]
            }
        }
        $parameters = $PSBoundParameters | ConvertTo-PSFHashtable -Include Server, Credential
    }
    
    process {
        $filterSegments = ($Filter -replace ",DC=.+$" -split "(?<=[^\\],)").TrimEnd(",")
        $basePath = $Filter -replace '^.+?,DC=','DC='
        [array]::Reverse($filterSegments)
    
        Get-AdNextStep -Parameters $parameters -Fragments $filterSegments -BasePath $basePath | Where-Object ObjectClass -Like $ObjectClass
    }
}