This script allows you to export a list of all users in the tenant and all associated proxy addresses.  It’s helpful to be able to get this as a csv filer for future reference so that you can quickly filter on whichever user you like.  It’s also been helpful for me on a recent migration where I was able to make sure that each user’s email addresses were properly migrated.

[cc lang="powershell"]$LogFilePath = $env:LOCALAPPDATA + "\Cloudwyse\Logs\user_proxy_addresses_" + $(get-date -Format ddMMyy_HHmmss) + ".log"
Start-Transcript -Path $LogFilePath -NoClobber
$365Pass = cat C:\cloudwyse\securestring365.txt | convertto-securestring
$365Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "admin@contoso.com",$365Pass
$DateTime = (Get-Date -Format "ddMMyyyy-HHmmss")
$365Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $365cred -Authentication Basic -AllowRedirection
Import-PSSession $365Session
Connect-Msolservice -Credential $365Cred
Write-Host  -ForegroundColor Magenta "Pulling mailbox information for all users, please be patient…"
$JobStart = Get-Date
$getmailbox = get-Mailbox
$JobEnd = Get-Date
$JobSecondsTaken =($JobEnd - $JobStart)
Write-Host  -ForegroundColor Yellow "Extract complete.  The Job took" $JobSecondsTaken.Seconds "seconds."
$total = $null
$Job2Start = Get-Date
$userList = @()
foreach ($user in $getmailbox)   {
$lookup = get-msoluser -userprincipalname $user.userprincipalname
       Write-Host  -ForegroundColor Magenta "Current user is" $user.userprincipalname
       $addresses = $lookup.proxyaddresses
       foreach ($address in $addresses) {
       $us = New-Object PSObject
             $us | Add-Member -type NoteProperty -Name 'UPN' -Value $lookup.userprincipalname
             $us | Add-Member -type NoteProperty -Name 'ProxyAddresses' -Value $address
             Write-Host  -ForegroundColor Cyan "Address is" $address
             $userList += $us
                                  }
       $total = $total +1
      }
$Job2End = Get-Date
$Job2SecondsTaken =($Job2End - $Job2Start)
Write-Host -ForegroundColor Yellow "$total users processed in" $Job2SecondsTaken.Minutes "minute(s) and" $Job2SecondsTaken.Seconds "second(s)."
Remove-PSSession $365Session
$userlist | export-csv C:\Cloudwyse\user_proxy_addresses$datetime.csv
Write-Host -ForegroundColor Yellow "Report exported to C:\Cloudwyse\user_proxy_addresses$datetime.csv"
Stop-Transcript[/cc]

I’ve shared this before, but if you are unsure how to securely store credentials in a script without using plain text then follow the instructions here to create the securestring.txt.