Public/Get-ADSIForest.ps1

function Get-ADSIForest
{
<#
    .SYNOPSIS
        Function to retrieve the current or specified forest
     
    .DESCRIPTION
        Function to retrieve the current or specified forest
     
    .PARAMETER Credential
        Specifies alternative credential to use
     
    .PARAMETER ForestName
        Specifies the ForestName to query
     
    .EXAMPLE
        Get-ADSIForest
     
    .EXAMPLE
        Get-ADSIForest -ForestName lazywinadmin.com
     
    .EXAMPLE
        Get-ADSIForest -Credential (Get-Credential superAdmin) -Verbose
     
    .EXAMPLE
        Get-ADSIForest -ForestName lazywinadmin.com -Credential (Get-Credential superAdmin) -Verbose
     
    .OUTPUTS
        System.DirectoryServices.ActiveDirectory.Forest
     
    .NOTES
        Francois-Xavier Cat
        LazyWinAdmin.com
        @lazywinadm
        github.com/lazywinadmin
#>

    
    [CmdletBinding()]
    [OutputType('System.DirectoryServices.ActiveDirectory.Forest')]
    param
    (
        [Alias("RunAs")]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential = [System.Management.Automation.PSCredential]::Empty,
        
        $ForestName = [System.DirectoryServices.ActiveDirectory.Forest]::Getcurrentforest()
    )
    
    PROCESS
    {
        TRY
        {
            IF ($PSBoundParameters['Credential'] -or $PSBoundParameters['ForestName'])
            {
                Write-Verbose "[PROCESS] Credential or FirstName specified"
                $Splatting = @{ }
                IF ($PSBoundParameters['Credential']) { $Splatting.Credential = $Credential }
                IF ($PSBoundParameters['ForestName']) { $Splatting.ForestName = $ForestName }
                
                $ForestContext = New-ADSIDirectoryContext @splatting
                [System.DirectoryServices.ActiveDirectory.Forest]::GetForest($ForestContext)
            }
            ELSE
            {
                [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
            }
            
        }
        CATCH
        {
            Write-Warning -Message "[PROCESS] Something wrong happened!"
            Write-Warning -Message $error[0].Exception.Message
        }
    }
}