Public/Exchange/Mailbox/Get/Test-ExMailboxProxyAddress.ps1

<#
    .SYNOPSIS
    Test if a given proxy address exists in the proxy addresses of a mailbox.
 
    .DESCRIPTION
    This cmdlet checks whether a specified proxy address is present in the proxy addresses of a given mailbox.
    It can process a single mailbox/proxy address pair or read multiple entries from a CSV file.
 
    .PARAMETER Mailbox
    The identity of the mailbox to check (e.g., email address, alias, or GUID).
    This parameter is used when processing a single mailbox/proxy address pair.
 
    .PARAMETER ProxyAddress
    The proxy address to check for in the mailbox's proxy addresses.
    This parameter is used when processing a single mailbox/proxy address pair.
 
    .PARAMETER CsvPath
    The path to a CSV file containing mailbox and proxy address pairs.
    This parameter is used when processing multiple entries from a CSV file.
 
    .PARAMETER MailboxColumn
    The name of the column in the CSV file that contains mailbox identities.
    Default is 'PrimarySmtpAddress'.
 
    .PARAMETER ProxyAddressColumn
    The name of the column in the CSV file that contains proxy addresses.
    Default is 'OnMicrosoftAddress'.
 
    .PARAMETER MatchOnly
    If specified, only returns entries where the proxy address matches.
 
    .PARAMETER NotMatchOnly
    If specified, only returns entries where the proxy address does not match.
 
    .EXAMPLE
    Test-ExMailboxProxyAddress -Mailbox "user@example.com" -ProxyAddress "alias@example.com"
 
    Tests if "alias@example.com" exists in the proxy addresses of the mailbox "user@example.com".
 
    .EXAMPLE
    Test-ExMailboxProxyAddress -CsvPath "C:\path\to\file.csv" -MailboxColumn "PrimarySmtpAddress" -ProxyAddressColumn "OnMicrosoftAddress"
     
    Reads mailbox and proxy address pairs from the specified CSV file and tests each pair.
 
    .EXAMPLE
    Test-ExMailboxProxyAddress -CsvPath "C:\path\to\file.csv" -MatchOnly
 
    Reads mailbox and proxy address pairs from the specified CSV file and returns only those that match.
 
    .EXAMPLE
    Test-ExMailboxProxyAddress -CsvPath "C:\path\to\file.csv" -NotMatchOnly
 
    Reads mailbox and proxy address pairs from the specified CSV file and returns only those that do not match.
 
    .LINK
    https://ps365.clidsys.com/docs/commands/Test-ExMailboxProxyAddress
#>


function Test-ExMailboxProxyAddress {
    param(
        [Parameter(Mandatory = $false, ParameterSetName = 'Single')]
        [string]$Mailbox,
        
        [Parameter(Mandatory = $false, ParameterSetName = 'Single')]
        [string]$ProxyAddress,
        
        [Parameter(Mandatory = $false, ParameterSetName = 'Csv')]
        [string]$CsvPath,
        
        [Parameter(Mandatory = $false, ParameterSetName = 'Csv')]
        [string]$MailboxColumn = 'PrimarySmtpAddress',
        
        [Parameter(Mandatory = $false, ParameterSetName = 'Csv')]
        [string]$ProxyAddressColumn = 'OnMicrosoftAddress',
        
        [Parameter(Mandatory = $false)]
        [switch]$MatchOnly,
        
        [Parameter(Mandatory = $false)]
        [switch]$NotMatchOnly
    )

    # Validation: If Mailbox or ProxyAddress is provided, both must be provided
    if ($PSCmdlet.ParameterSetName -eq 'Single') {
        if (($Mailbox -and -not $ProxyAddress) -or (-not $Mailbox -and $ProxyAddress)) {
            throw 'Mailbox and ProxyAddress parameters must be used together. If you specify one, you must specify the other.'
        }
        if (-not $Mailbox -and -not $ProxyAddress -and -not $CsvPath) {
            throw 'You must specify either Mailbox and ProxyAddress together, or CsvPath.'
        }
    }

    [System.Collections.Generic.List[PSCustomObject]]$results = @()
    
    # Direct processing based on parameter type
    if ($PSCmdlet.ParameterSetName -eq 'Csv') {
        # If the column does not exist, throw an error
        
        $data = Import-Csv -Path $CsvPath -Delimiter ';'

        # If the columns do not exist, throw an error
        if (-not ($data | Get-Member -Name $MailboxColumn)) {
            throw "Column '$MailboxColumn' does not exist in the CSV file."
            return
        }
        if (-not ($data | Get-Member -Name $ProxyAddressColumn)) {
            throw "Column '$ProxyAddressColumn' does not exist in the CSV file."
            return
        }

        $itemsToProcess = $data | ForEach-Object { @{ Mailbox = $_.$MailboxColumn; ProxyAddress = $_.$ProxyAddressColumn } }
    }
    else {
        $itemsToProcess = @(@{ Mailbox = $Mailbox; ProxyAddress = $ProxyAddress })
    }
    
    # Process all items with the same logic
    foreach ($item in $itemsToProcess) {
        Write-Host -ForegroundColor Cyan "Checking mailbox: $($item.Mailbox) for email: $($item.ProxyAddress)"
        
        $statusValue = 'ERROR'
        
        try {
            $mb = Get-EXOMailbox -Identity $item.Mailbox -ErrorAction Stop
            
            if ($mb.EmailAddresses -contains "smtp:$($item.ProxyAddress)") {
                $statusValue = 'MATCH'
            }
            else {
                $statusValue = 'NOTMATCH'
            }
        }
        catch {
            $statusValue = 'ERROR'
        }
        
        $object = [PSCustomObject][ordered]@{
            Mailbox      = $item.Mailbox
            ProxyAddress = $item.ProxyAddress
            Status       = $statusValue
        }
        
        $results.Add($object)
    }

    if ($MatchOnly) {
        return $results | Where-Object { $_.Status -eq 'MATCH' }
    }
    elseif ($NotMatchOnly) {
        return $results | Where-Object { $_.Status -ne 'MATCH' }
    }
    else {
        return $results
    }
}