ForestDomain.psm1

#region Functions
#region Get-ActiveDirectoryForestLDAP
Function Get-ActiveDirectoryForestLDAP
{
    [cmdletBinding(DefaultParameterSetName = "None")]

    Param
    (
        [Parameter(Mandatory = $true, ParameterSetName = "Custom-Server")]
        [string]
        $Server,

        [Parameter(Mandatory = $true, ParameterSetName = "Custom-DomainName")]
        [string]
        $Name,

        [Parameter(Mandatory = $true, ParameterSetName = "Custom-Server")]
        [Parameter(Mandatory = $true, ParameterSetName = "Custom-DomainName")]
        [PSCredential]
        $Credential
    )

    if($Credential)
    {
        Write-Verbose "Using provided account credentials."

        if($Name)
        {
            $directoryContext = New-Object -TypeName System.DirectoryServices.ActiveDirectory.DirectoryContext -ArgumentList @(,"Forest", $Name, $Credential.UserName, $Credential.GetNetworkCredential().Password)
        }

        if($Server)
        {
            $directoryContext = New-Object -TypeName System.DirectoryServices.ActiveDirectory.DirectoryContext -ArgumentList @(,"DirectoryServer", $Server, $Credential.UserName, $Credential.GetNetworkCredential().Password)
        }

        $forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetForest($directoryContext)

    }
    else
    {
        Write-Verbose "Using current context account."
        $forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
    }

    $forest |
        Select-Object -Property Name,Sites,Domains,ForestModeLevel,ForestMode,RootDomain
}
#endregion

#region Get-ActiveDirectoryDomainLDAP
Function Get-ActiveDirectoryDomainLDAP
{
    [cmdletBinding(DefaultParameterSetName = "None")]

    Param
    (
        [Parameter(Mandatory = $true, ParameterSetName = "Custom-Server")]
        [string]
        $Server,

        [Parameter(Mandatory = $true, ParameterSetName = "Custom-DomainName")]
        [string]
        $Name,

        [Parameter(Mandatory = $true, ParameterSetName = "Custom-Server")]
        [Parameter(Mandatory = $true, ParameterSetName = "Custom-DomainName")]
        [PSCredential]
        $Credential
    )

    if($Credential)
    {
        Write-Verbose "Using provided account credentials."

        if($Name)
        {            
            $directoryContext = New-Object -TypeName System.DirectoryServices.ActiveDirectory.DirectoryContext -ArgumentList @(,"Domain", $Name, $Credential.UserName, $Credential.GetNetworkCredential().Password)
        }
        
        if($Server)
        {
            $directoryContext = New-Object -TypeName System.DirectoryServices.ActiveDirectory.DirectoryContext -ArgumentList @(,"DirectoryServer", $Server, $Credential.UserName, $Credential.GetNetworkCredential().Password)
        }

        $domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain($directoryContext)
    }
    else
    {
        Write-Verbose "Using current context account."
        $domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
    }

    $domain |
        Select-Object -Property Name,Forest,DomainModeLevel,DomainMode
}
#endregion
#endregion

#region Exports
Export-ModuleMember -Function Get-ActiveDirectoryForestLDAP
Export-ModuleMember -Function Get-ActiveDirectoryDomainLDAP
#endregion