Get-CanonicalName.ps1

<#
    .SYNOPSIS
 
    This function returns the canonicalName associated with a distinguished name.
     
    .DESCRIPTION
 
    This function returns the canonicalName associated with a distinguished name.
 
    .PARAMETER GlobalCatalog
 
    The global catalog to make the query against.
 
    .PARAMETER DN
 
    The DN of the object to pass to normalize.
 
    .OUTPUTS
 
    The canonical name of a given object.
 
    .EXAMPLE
 
    get-canonicalName -globalCatalog GC -DN DN -adCredential $cred
 
    #>

    Function get-canonicalName
     {
        [cmdletbinding()]

        Param
        (
            [Parameter(Mandatory = $true)]
            [string]$globalCatalogServer,
            [Parameter(Mandatory = $true)]
            [string]$DN,
            [Parameter(Mandatory = $false)]
            [ValidateSet("Basic","Negotiate")]
            $activeDirectoryAuthenticationMethod="Negotiate",            
            [Parameter(Mandatory = $true)]
            $adCredential
        )

        #Output all parameters bound or unbound and their associated values.

        write-functionParameters -keyArray $MyInvocation.MyCommand.Parameters.Keys -parameterArray $PSBoundParameters -variableArray (Get-Variable -Scope Local -ErrorAction Ignore)

        #Declare function variables.

        $functionTest=$NULL #Holds the return information for the group query.
        $functionObject=$NULL #This is used to hold the object that will be returned.
        $functionDomain=$NULL

        #Start function processing.

        Out-LogFile -string "********************************************************************************"
        Out-LogFile -string "BEGIN GET-CanoicalName"
        Out-LogFile -string "********************************************************************************"
        
        #Get the specific user using ad providers.

        $stopLoop = $FALSE
        [int]$loopCounter = 0

        do {
            try 
            {
                Out-LogFile -string "Gathering the AD object based on distinguished name."
    
                $functionTest = get-adobject -filter {distinguishedname -eq $dn} -properties canonicalName -credential $adCredential -authType $activeDirectoryAuthenticationMethod -server $globalCatalogServer -errorAction STOP

                $stopLoop = $TRUE
            }
            catch 
            {
                if ($loopCounter -gt 4)
                {
                    out-logfile -string $_ -isError:$TRUE
                }
                else 
                {
                    out-logfile -string "Error getting AD object - sleep and retry."
                    
                    $loopCounter = $loopCounter +1

                    start-sleepProgress -sleepString "Error with get-adobject -> sleep and try again." -sleepSeconds 5

                }
                
            }
    
        } until ($stopLoop -eq $TRUE)
        
       
        try
        {
            #Now that we have the canonicalName - record it and build just the domain name portion of it for reference.

            #Split the string at / -> results in the domain name being in position 0.

            $functionDomain=$functiontest.canonicalName.split("/")

            $functionObject = New-Object PSObject -Property @{
                canonicalName = $functionTest.canonicalName
                canonicalDomainName = $functionDomain[0]
                distinguishedName = $functiontest.distinguishedName
            }
        }
        catch
        {
            Out-LogFile -string $_ -isError:$true  
        }

        Out-LogFile -string "END GET-CanonicalName"
        Out-LogFile -string "********************************************************************************"
        
        #This function is designed to open local and remote powershell sessions.
        #If the session requires import - for example exchange - return the session for later work.
        #If not no return is required.
        
        return $functionObject
    }