Zunächst ein paar Informationen zum…
Hintergrund:
Standardmäßig erweitert der Hybrid Wizard die bestehenden Email Adressrichtlinien automatisch um eine <tenant name>.mail.onmicrosoft.com Adresse. Das Ergebnis sieht wie folgt aus:

So wird sichergestellt, dass für alle Empfänger eine entsprechende Adresse zur Verfügung steht. Diese kommen zum Einsatz, wenn zwischen Exchange onprem und Exchange Online Mails hin und hergehen – zwischen migrierten und (noch) nicht migrierten Empfängern. Ein onprem Benutzer sieht durch die Adressrichtlinie z.B. so aus:

Nach erfolgter Migration wird aus der zusätzlichen Adresse dann automatisch die sogenannte Remote Routing Adresse (kurz RRA) – diese kann bei Bedarf noch über einen Dropdown im UI geändert werden. Das sieht z.B. so aus:

Im AD lässt verewigt sich das Ganze als Attribut „targetAddress“.

Eine „targetAddress“ übersteuert quasi die primäre SMTP Adresse – sendet ein onprem User eine Mail an einen Cloud user (mit RRA), dann schreibt Exchange automatisch die Zieladresse um in die RRA und versucht die Zustellung darüber. Bei der Suche nach dem passenden Send Connector wird es bei „Outbound to <guid>“ fündig – dieser Connector wurde ebenfalls vom Hybrid Wizard erstellt und ist scoped auf genau diese domain. Exchange sendet also die Mail über diesen Connector an Exchange Online.

Exchange Online empfängt die Mail, schreibt die Zieladresse wieder um in die ursprüngliche (in meinem Fall @zarenko.net) und stellt die Mail zu ins Zielpostfach – so schließt sich der Kreis. Die Rückrichtung funktioniert ähnlich über einen ebenfalls vom Hybrid Wizard angelegten Outbound Connector in Exchange Online, der zu Exchange onprem führt.
Herausforderung
In den meisten Umgebungen, die ich sehe, ist bei vielen Mailboxen die standardmäßig aktivierte Option „EmailAddressPolicyEnabled“ explizit deaktiviert – meistens, um eine vom Standardschema abweichende primäre SMTP-Adresse zu vergeben. Wenn dies vor dem erstmaligen Ausführen des Hybrid Wizard geschehen ist, wird für diese Mailboxen keine geeignete sekundäre Adresse definiert. Soll eine solche Mailbox dann in die Cloud migriert werden, schlägt der Migrationsjob fehl. Um das zu verhindern, nehmt ihr am einfachsten mein Skript und sorgt im Vorfeld dafür, dass alle eine potentielle RRA haben 🙂

Wenn ihr es mit -whatif aufruft, erhaltet ihr erstmal eine Auflistung, welche (und wieviele) Mailboxen betroffen sind.
# Run on Exchange On-Premises (local shell or remote session)
# Ensures all mailboxes have a *.mail.onmicrosoft.com remote routing address.
[CmdletBinding(SupportsShouldProcess)]
param (
[Parameter(Mandatory)]
[string]$Domain # e.g. "contoso" → contoso.mail.onmicrosoft.com
)
$ErrorActionPreference = 'Stop'
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
# Strip TLD if provided (e.g. "contoso.com" → "contoso")
$Domain = $Domain -replace '\.[^.]+$'
$targetSuffix = "@$Domain.mail.onmicrosoft.com"
function Write-Status {
param([string]$Text, [string]$Color = 'White')
Write-Host $Text -ForegroundColor $Color
}
$mailboxes = Get-Mailbox -Filter {EmailAddressPolicyEnabled -eq $false}
$total = $mailboxes.Count
$i = 0
$changed = 0
$skipped = 0
$errors = 0
foreach ($mbx in $mailboxes) {
$i++
$alias = $mbx.Alias
$identity = $mbx.Identity
Write-Status "[$i/$total] $alias" Cyan
try {
# Check if RRA already exists — string comparison on deserialized object
$hasRRA = $mbx.EmailAddresses | Where-Object { $_.ToString() -like "*$targetSuffix" }
if ($hasRRA) {
Write-Status " OK – RRA already present ($hasRRA)" Green
$skipped++
continue
}
Write-Status " RRA missing" Yellow
# Disable EmailAddressPolicyEnabled if still set
if ($mbx.EmailAddressPolicyEnabled) {
Write-Status " EmailAddressPolicyEnabled → False" Yellow
if ($PSCmdlet.ShouldProcess($identity, 'Set EmailAddressPolicyEnabled to False')) {
Set-Mailbox -Identity $identity -EmailAddressPolicyEnabled $false
}
}
# Add address via hashtable syntax — works even on deserialized remote session objects
$newAddress = "smtp:$alias$targetSuffix"
Write-Status " Adding: $newAddress" Yellow
if ($PSCmdlet.ShouldProcess($identity, "Add remote routing address: $newAddress")) {
Set-Mailbox -Identity $identity -EmailAddresses @{ Add = $newAddress }
}
Write-Status " Done" Green
$changed++
}
catch {
Write-Status " ERROR for $alias`: $_" Red
$errors++
}
}
Write-Host ""
Write-Host "Summary:" -ForegroundColor White
Write-Host " Total: $total"
Write-Host " Changed: $changed" -ForegroundColor Yellow
Write-Host " Skipped: $skipped" -ForegroundColor Green
Write-Host " Errors: $errors" -ForegroundColor $(if ($errors) { 'Red' } else { 'Green' })
if ($WhatIfPreference) { Write-Host " (WhatIf mode – no changes made)" -ForegroundColor Cyan }Viel Spaß damit 🙂

von