Public/Import-CGMMExchOnPrem.ps1

Function Import-CGMMExchOnPrem {
    <#
    .SYNOPSIS
    Connects to on premise Exchange with a specific prefix
 
    .DESCRIPTION
    Connects to on premise Exchange with a specific prefix used by the module to interact with the service.
 
    .EXAMPLE
    Import-CGMMExchOnPrem -Credential $Credential -ExchangeServer $ExchangeServer
 
    Connect to a specified on premise Exchange server using the specified credentials.
    .EXAMPLE
    Import-CGMMExchOnPrem -Credential $Credential -ExchangeServer $ExchangeServer -ViewEntireForest
 
    Connect to a specified on premise Exchange server using the specified credentials and configures the setting to view the entire forest.
    .NOTES
 
    #>


    [CmdletBinding()]
    Param(
        [parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.CredentialAttribute()]
        $Credential,

        [parameter(Mandatory)]
        [string]$ExchangeServer,

        [parameter()]
        [switch]$ViewEntireForest
    )

    Begin {}

    Process {
        $Prefix = $PremCmdletPrefix

        # New-PSSession
        $SessionParameters = @{
            'ConfigurationName'        = 'Microsoft.Exchange(CGMMOnPrem)'
            'ConnectionUri'            = "http://$($ExchangeServer)/Powershell/?SerializationLevel=Full"
            'Credential'            = $Credential
            'Authentication'        = 'Kerberos'
        }
        Try {$Session = New-PSSession @SessionParameters -ErrorAction Stop}
        Catch {
            $PsCmdlet.ThrowTerminatingError($PSItem)
        }

        # Import-PSSession
        $PSSessionParameters = @{
            'Session'    = $Session
        }
        If ($Prefix) {$PSSessionParameters.Add("Prefix",$Prefix)}
        Try {$ModuleInfo = Import-PSSession @PSSessionParameters -AllowClobber -DisableNameChecking -ErrorAction Stop}
        Catch {
            $PsCmdlet.ThrowTerminatingError($PSItem)
        }

        # Import-Module
        $ModuleParameters = @{
            'ModuleInfo'    = $ModuleInfo
        }
        If ($Prefix) {$ModuleParameters.Add("Prefix",$Prefix)}
        Try {Import-Module @ModuleParameters -DisableNameChecking -Global -ErrorAction Stop}
        Catch {
            $PsCmdlet.ThrowTerminatingError($PSItem)
        }

        # Set-ADServerSettings to view the entire forest
        If ($ViewEntireForest) {
            $ADServerSettings = Get-Command "Set-$($Prefix)ADServerSettings"
            If ($ADServerSettings) {
                & $ADServerSettings -ViewEntireForest $True
            }
        }
    }

    End {}
}