Private/Connect/Connect-EXOPSSession.ps1

function Connect-EXOPSSession {
    <#
        .SYNOPSIS
            To connect in other Office 365 offerings, use the following settings:
            - Office 365 operated by 21Vianet: -ConnectionURI https://partner.outlook.cn/PowerShell-LiveID -AzureADAuthorizationEndpointUri https://login.chinacloudapi.cn/common
            - Office 365 Germany: -ConnectionURI https://outlook.office.de/PowerShell-LiveID -AzureADAuthorizationEndpointUri https://login.microsoftonline.de/common
 
            - PSSessionOption accept object created using New-PSSessionOption
        .DESCRIPTION
            This PowerShell module allows you to connect to Exchange Online service
        .LINK
            https://go.microsoft.com/fwlink/p/?linkid=837645
    #>


    param(
        # Connection Uri for the Remote PowerShell endpoint
        [string] $ConnectionUri = 'https://outlook.office365.com/PowerShell-LiveId',

        # Azure AD Authorization endpoint Uri that can issue the OAuth2 access tokens
        [string] $AzureADAuthorizationEndpointUri = 'https://login.windows.net/common',

        # User Principal Name or email address of the user
        [string] $UserPrincipalName = '',

        # PowerShell session options to be used when opening the Remote PowerShell session
        [System.Management.Automation.Remoting.PSSessionOption] $PSSessionOption = $null,

        # User Credential to Logon
        [System.Management.Automation.PSCredential] $Credential = $null
    )

    # Validate parameters
    if (-not (Test-Uri $ConnectionUri)) {
        throw "Invalid ConnectionUri parameter '$ConnectionUri'"
    }
    if (-not (Test-Uri $AzureADAuthorizationEndpointUri)) {
        throw "Invalid AzureADAuthorizationEndpointUri parameter '$AzureADAuthorizationEndpointUri'"
    }

    try {
        $modules = @(Get-ChildItem -Path "$($env:LOCALAPPDATA)\Apps\2.0" -Filter "Microsoft.Exchange.Management.ExoPowershellModule.manifest" -Recurse )
        $ModulePath = Join-Path $modules[0].Directory.FullName "Microsoft.Exchange.Management.ExoPowershellModule.dll"
        # $ExoPowershellModule = "Microsoft.Exchange.Management.ExoPowershellModule.dll";
        # $ModulePath = [System.IO.Path]::Combine($PSScriptRoot, $ExoPowershellModule);

        $global:ConnectionUri = $ConnectionUri;
        $global:AzureADAuthorizationEndpointUri = $AzureADAuthorizationEndpointUri;
        $global:UserPrincipalName = $UserPrincipalName;
        $global:PSSessionOption = $PSSessionOption;
        $global:Credential = $Credential;

        Import-Module $ModulePath -DisableNameChecking -WarningAction SilentlyContinue
        $PSSplat = @{
            UserPrincipalName               = $UserPrincipalName
            ConnectionUri                   = $ConnectionUri
            AzureADAuthorizationEndpointUri = $AzureADAuthorizationEndpointUri
            PSSessionOption                 = $PSSessionOption
            Credential                      = $Credential
            WarningAction                   = 'SilentlyContinue'
        }
        $PSSession = New-ExoPSSession @PSSplat

        if ($PSSession -ne $null) {
            Import-PSSession $PSSession -AllowClobber -DisableNameChecking -WarningAction SilentlyContinue
            Get-RemotingHandler
        }
    }
    catch {
        Write-Error -Message "Error: $($_.Exception.Message)"
        throw "IF INITIAL SETUP, YOU CAN SAFELY IGNORE THIS ERROR"
    }
}