Public/Exchange/Mailbox/Get/Get-ExMailboxProtocol.ps1

<#
    .SYNOPSIS
    Retrieves mailbox protocol settings for Exchange Online mailboxes.
 
    .DESCRIPTION
    This function retrieves the protocol settings (MAPI, OWA, IMAP, POP, EWS, ActiveSync)
    for Exchange Online mailboxes. It can filter mailboxes by identity or by domain.
    Additionally, it provides information about SMTP Client Authentication settings
    at both the mailbox and tenant levels.
 
    .PARAMETER Identity
    The identity of the mailbox to retrieve protocol settings for.
    If not specified, the function retrieves settings for all mailboxes.
 
    .PARAMETER ByDomain
    The domain to filter mailboxes by. Only mailboxes with a primary SMTP address in this
    domain will be processed.
 
    .PARAMETER ExportToExcel
    If specified, exports the results to an Excel file in the user's profile directory.
 
    .EXAMPLE
    Get-ExMailboxProtocol
 
    Retrieves mailbox protocol settings for all Exchange Online mailboxes.
 
    .EXAMPLE
    Get-ExMailboxProtocol -Identity "user@example.com"
 
    Retrieves mailbox protocol settings for the specified mailbox.
 
    .EXAMPLE
    Get-ExMailboxProtocol -ByDomain "example.com"
 
    Retrieves mailbox protocol settings for all mailboxes in the specified domain.
 
    .EXAMPLE
    Get-ExMailboxProtocol -ExportToExcel
 
    Exports mailbox protocol settings for all Exchange Online mailboxes to an Excel file in the user's profile directory.
 
    .LINK
    https://ps365.clidsys.com/docs/commands/Get-ExMailboxProtocol
#>


function Get-ExMailboxProtocol {
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [string]$Identity,

        [Parameter(Mandatory = $false)]
        [string]$ByDomain,

        [Parameter(Mandatory = $false)]
        [switch]$ExportToExcel
    )

    [System.Collections.Generic.List[PSCustomObject]]$exoCasMailboxesArray = @()

    $tenantSmtpClientAuthenticationDisabled = (Get-TransportConfig).SmtpClientAuthenticationDisabled

    if ($tenantSmtpClientAuthenticationDisabled) {
        Write-Host 'SMTP Client Authentication is disabled' -ForegroundColor Green
        $tenantSmtpClientAuthenticationEnabled = $false
    }
    else {
        Write-Host 'SMTP Client Authentication is enabled' -ForegroundColor Yellow
        $tenantSmtpClientAuthenticationEnabled = $true
    }

    # PropertySets All because by default SMTPClientAuthenticationDisabled is not returned
    if ($ByDomain) {
        $casMailboxes = Get-EXOCasMailbox -ResultSize Unlimited -Filter "EmailAddresses -like '*@$ByDomain'" -PropertySets All | Where-Object { $_.PrimarySmtpAddress -like "*@$ByDomain" }
    }
    elseif ($Identity) {
        [System.Collections.Generic.List[PSCustomObject]]$casMailboxes = @()
        try {
            $mbx = Get-EXOCasMailbox -Identity $Identity -PropertySets All
            $casMailboxes.Add($mbx)
        }
        catch {
            Write-Warning "Mailbox not found: $Identity"
        }
    }
    else {
        $casMailboxes = Get-EXOCasMailbox -ResultSize Unlimited -PropertySets All
    }

    <#
    ECPEnabled : True
    OWAEnabled : True
    ImapEnabled : True
    PopEnabled : True
    MAPIEnabled : True
    EwsEnabled : True
    ActiveSyncEnabled : True
    #>


    foreach ($casMailbox in $casMailboxes) {
    
        $object = [PSCustomObject][ordered]@{ 
            PrimarySmtpAddress                    = $casMailbox.PrimarySmtpAddress
            DisplayName                           = $casMailbox.DisplayName
            ExchangeObjectId                      = $casMailbox.ExchangeObjectId
            MAPIEnabled                           = $casMailbox.MAPIEnabled
            OWAEnabled                            = $casMailbox.OWAEnabled
            UniversalOutlookEnabled               = $casMailbox.UniversalOutlookEnabled
            OutlookMobileEnabled                  = $casMailbox.OutlookMobileEnabled
            IMAPEnabled                           = $casMailbox.ImapEnabled
            POPEnabled                            = $casMailbox.PopEnabled
            EwsEnabled                            = $casMailbox.EwsEnabled
            ActiveSyncEnabled                     = $casMailbox.ActiveSyncEnabled
            # CMDlet returns SMTPClientAuthenticationDisabled but we want SMTPClientAuthenticationEnabled
            ECPEnabled                            = $casMailbox.ECPEnabled
            # we invert the value to provide SMTPClientAuthenticationEnabled because by default the cmdlet returns SMTPClientAuthentication*Disabled*
            SMTPClientAuthenticationEnabled       = if ($null -ne $casMailbox.SMTPClientAuthenticationDisabled) { -not $casMailbox.SMTPClientAuthenticationDisabled }else { '-' }
            TenantSmtpClientAuthenticationEnabled = $tenantSmtpClientAuthenticationEnabled
            MailboxWhenCreated                    = $casMailbox.WhenCreated
            MailboxWhenModified                   = $casMailbox.WhenChanged
        }

        $exoCasMailboxesArray.Add($object)
    }

    if ($ExportToExcel.IsPresent) {
        $now = Get-Date -Format 'yyyy-MM-dd_HHmmss'
        $excelFilePath = "$($env:userprofile)\$now-ExMailboxProtocol.xlsx"
        Write-Host -ForegroundColor Cyan "Exporting mailbox protocols to Excel file: $excelFilePath"
        $exoCasMailboxesArray | Export-Excel -Path $excelFilePath -AutoSize -AutoFilter -WorksheetName 'ExchangeMailboxProtocols'
        Write-Host -ForegroundColor Green 'Export completed successfully!'
    }
    else {
        return $exoCasMailboxesArray
    }
}