src/ConnectEws.ps1

$EWS = 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll'

If(Test-Path $EWS) {
    $Null = [Reflection.Assembly]::LoadFile($EWS)
} Else {
    Throw "Required EWS Managed API 2.2 not found at: $EWS. Available at https://www.microsoft.com/en-us/download/details.aspx?id=42951"
}

Function Connect-Ews {
    [CmdletBinding(DefaultParameterSetName='UserPrincipalName')]
    [OutputType([Microsoft.Exchange.WebServices.Data.ExchangeService])]
    Param(
        [Parameter(Position=0,Mandatory,ParameterSetName='UserPrincipalName')]
        [Parameter(Position=0,Mandatory,ParameterSetName='UserPrincipalName+Autodiscover')]
        [Parameter(Position=0,Mandatory,ParameterSetName='UserPrincipalName+Endpoint')]
        [Alias('Username','User')]
        [String]$UserPrincipalName,

        [Parameter(Mandatory,ParameterSetName='UserPrincipalName')]
        [Parameter(Mandatory,ParameterSetName='UserPrincipalName+Autodiscover')]
        [Parameter(Mandatory,ParameterSetName='UserPrincipalName+Endpoint')]
        [SecureString]$Password,

        [Parameter(Mandatory,ParameterSetName='Credential')]
        [Parameter(Mandatory,ParameterSetName='Credential+Autodiscover')]
        [Parameter(Mandatory,ParameterSetName='Credential+Endpoint')]
        [System.Management.Automation.PSCredential]$Credential,

        [Alias('V')]
        [Microsoft.Exchange.WebServices.Data.ExchangeVersion]$Version = 'Exchange2013_SP1',

        [Parameter(Mandatory,ParameterSetName='UserPrincipalName+Autodiscover')]
        [Parameter(Mandatory,ParameterSetName='Credential+Autodiscover')]
        [MailAddress]$EmailAddress,

        [Parameter(Mandatory,ParameterSetName='UserPrincipalName+Endpoint')]
        [Parameter(Mandatory,ParameterSetName='Credential+Endpoint')]
        [Uri]$Endpoint
    )

    If($Credential) {
        $UserPrincipalName = $Credential.UserName
        $PlaintextPwd = $Credential.GetNetworkCredential().Password
    }

    If($UserPrincipalName -and $Password) {
        $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
        [String]$PlaintextPwd = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    }

    If(-Not $EmailAddress) {
        $EmailAddress = $UserPrincipalName
    }

    $Credentials = New-Object System.Net.NetworkCredential($UserPrincipalName,$PlaintextPwd)
    $Script:Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($Version)
    $Script:Service.Credentials = $Credentials

    Try {
        If($Endpoint) {
            Write-Verbose "EWS ENDPOINT: $Endpoint"
            $Service.Url = $Endpoint
        } Else {
            $TestUrlCallback = {
                Param([Uri]$Url)
                Write-Verbose "AUTODISCOVER REDIRECT: $Url"
                If($Url -eq 'https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml') {$True} Else {$False}
            }

            $Service.AutodiscoverUrl($EmailAddress, $TestUrlCallback)
        }
    } Catch {
        Write-Error "Error: Autodiscover failed for recipient: $EmailAddress"
    }

    $Script:Service
}