EXO-migrering utan Remote Move
Så här etableras lokala Exchange-postlådor kontrollerat som nya, tomma postlådor i Exchange Online: PST-säkerhetskopiering, CSV-godkännande, RemoteMailbox, synkronisering, validering och återställning.
En Hybrid Remote Move är den normala vägen för att flytta en lokal Exchange-postlåda med allt innehåll till Exchange Online. Alla organisationer tillåter inte denna migreringsväg. Om en säkerhetspolicy utesluter Remote Moves kan ett medvetet annorlunda tillvägagångssätt vara försvarbart: Den lokala postlådan säkerhetskopieras som PST, kopplas bort från den synkroniserade AD-användaren och en ny, tom postlåda i Exchange Online etableras för samma användare.
Denna väg är ingen postlådemigrering. Den överför varken meddelanden, kalendrar, regler eller behörigheter till molnet. PST-filen används uteslutande som säkerhetskopia och importeras inte i detta scenario. Därför är förfarandet endast lämpligt när en tom målpostlåda är verksamhetsmässigt acceptabel och förlusten av den aktiva postlådeskonfigurationen uttryckligen har godkänts.
Måltillstånd och hårda förutsättningar
Efter cutover finns samma AD-användare kvar. Lokalt hanteras den dock inte längre som UserMailbox, SharedMailbox, RoomMailbox eller EquipmentMailbox, utan som RemoteMailbox. Efter synkroniseringen representerar detta objekt den nya postlådan i Exchange Online.
Det önskade tillståndet ser ut så här:
- Den lokala postlådan är fullständigt säkerhetskopierad som PST.
- Den lokala postlådan är frånkopplad men ännu inte slutgiltigt raderad inom den konfigurerade kvarhållningstiden.
- Den befintliga AD-användaren är aktiverad som RemoteMailbox.
- Primär adress, alias och den gamla
LegacyExchangeDNfinns kvar. - Entra Connect har synkroniserat ändringarna.
- En Exchange Online-tjänstplan är tilldelad för användarpostlådor.
- Exchange Online visar en verklig molnpostlåda och e-postflödet avslutas där.
Följande måste dessutom vara klarlagt före start:
- PST-resursen är åtkomlig via UNC. Gruppen
Exchange Trusted Subsystemhar läs- och skrivbehörighet där. - Kontot som kör processen har hanteringsrollen
Mailbox Import Export. - PST-filen är endast den överenskomna säkerhetskopian; ingen senare import planeras.
- Kvarhållning, Litigation Hold, eDiscovery och regulatoriska krav har granskats separat.
- Ombud, Send-As, Send-on-Behalf, vidarebefordringar, inkorgsregler, mobila enheter och applikationsåtkomst har inventerats.
- Under export och omkoppling hålls inkommande meddelanden kontrollerat kvar vid den föregående gatewayen. Användare och applikationer får inte längre skriva till källpostlådan.
- Kvarhållningen för den lokala postlådedatabasen täcker återställningsfönstret.
Varför en CSV-godkännandelista är oumbärlig
En direkt pipeline som Get-Mailbox | Disable-Mailbox är för riskabel för denna process. Den skulle även kunna omfatta system-, Discovery- eller andra ej godkända postlådor. Följande förfarande använder därför två uttryckliga godkännanden:
Action=CUTOVERavgör vilken rad som faktiskt får ställas om.PstVerified=YESbekräftar att exportfilen har kontrollerats tekniskt och organisatoriskt.
Först skapas endast inventariet:
$CsvPath = "C:\Migration\mailboxes.csv"
$RemoteRoutingDomain = "contoso.mail.onmicrosoft.com"
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails `
UserMailbox,SharedMailbox,RoomMailbox,EquipmentMailbox |
Sort-Object PrimarySmtpAddress |
ForEach-Object {
[pscustomobject]@{
Identity = $_.Identity
DisplayName = $_.DisplayName
PrimarySmtpAddress = $_.PrimarySmtpAddress.ToString()
Alias = $_.Alias
SourceType = $_.RecipientTypeDetails.ToString()
ArchiveStatus = $_.ArchiveStatus.ToString()
ServerName = $_.ServerName
Database = $_.Database.ToString()
RemoteRoutingAddress = "$($_.Alias)@$RemoteRoutingDomain"
Action = "REVIEW"
PstVerified = "NO"
}
} |
Export-Csv -Path $CsvPath -NoTypeInformation -Encoding UTF8
Filen rensas därefter verksamhetsmässigt. Endast faktiskt godkända postlådor får Action=CUTOVER. Systempostlådor och specialobjekt hör inte hemma i denna lista.
Fas 1: Säkerhetskopiera primär postlåda och arkiv som PST
New-MailboxExportRequest skriver endast till en UNC-sökväg. Ett unikt filnamn skapas för varje postlåda. Ett aktivt onlinearkiv i lokala Exchange exporteras separat:
$CsvPath = "C:\Migration\mailboxes.csv"
$PstShare = "\\fileserver\exchange-pst$"
$BatchName = "EXO-NewMailbox-20260807"
$targets = Import-Csv $CsvPath | Where-Object Action -eq "CUTOVER"
foreach ($row in $targets) {
$safeName = ($row.PrimarySmtpAddress -replace '[^a-zA-Z0-9@._-]', '_')
$primaryPath = "$PstShare\$safeName.pst"
New-MailboxExportRequest `
-Mailbox $row.Identity `
-FilePath $primaryPath `
-Name "Primary-$safeName" `
-BatchName $BatchName
if ($row.ArchiveStatus -eq "Active") {
New-MailboxExportRequest `
-Mailbox $row.Identity `
-IsArchive `
-FilePath "$PstShare\$safeName-archive.pst" `
-Name "Archive-$safeName" `
-BatchName $BatchName
}
}
Exporten är inte godkänd förrän varje begäran har statusen Completed:
Get-MailboxExportRequest -BatchName $BatchName |
Get-MailboxExportRequestStatistics -IncludeReport |
Format-Table DisplayName,Status,PercentComplete,FailureCode,Message -AutoSize
Get-MailboxExportRequest -BatchName $BatchName |
Where-Object Status -ne "Completed"
Dessutom ska filernas existens, storlek, läsbarhet, övertagande av säkerhetskopian och åtkomstskydd kontrolleras. Först därefter sätts PstVerified=YES för motsvarande CSV-rad.
Fas 2: Säkerhetskopiera postlådedata och Exchange-attribut
Före den första ändringen skapas en maskinläsbar ögonblicksbild per postlåda. Den är viktigare än en skärmbild eftersom alias, GUID:er och LegacyExchangeDN senare kan rekonstrueras exakt:
$SnapshotPath = "C:\Migration\Snapshots"
New-Item -ItemType Directory -Path $SnapshotPath -Force | Out-Null
Import-Csv "C:\Migration\mailboxes.csv" |
Where-Object { $_.Action -eq "CUTOVER" -and $_.PstVerified -eq "YES" } |
ForEach-Object {
$mailbox = Get-Mailbox -Identity $_.Identity
$safeName = ($_.PrimarySmtpAddress -replace '[^a-zA-Z0-9@._-]', '_')
$mailbox |
Select-Object Identity,DistinguishedName,ExchangeGuid,ArchiveGuid,
RecipientTypeDetails,PrimarySmtpAddress,EmailAddresses,
LegacyExchangeDN,Alias,Database,ServerName |
Export-Clixml "$SnapshotPath\$safeName.xml"
}
Delegeringar och vidarebefordringar kräver separata exporter. Minst följande information bör säkerhetskopieras separat:
$mailbox = Get-Mailbox -Identity user01@contoso.com
$mailbox | Format-List ForwardingAddress,ForwardingSmtpAddress,DeliverToMailboxAndForward
Get-MailboxPermission -Identity $mailbox.Identity
Get-ADPermission -Identity $mailbox.DistinguishedName
Get-InboxRule -Mailbox $mailbox.Identity
Get-CalendarProcessing -Identity $mailbox.Identity -ErrorAction SilentlyContinue
Dessa konfigurationer flyttas inte automatiskt till den nya molnpostlådan.
Fas 3: Koppla bort lokal postlåda och aktivera RemoteMailbox
Själva cutovern är kort men betydelsefull. Disable-Mailbox tar bort Exchange-attributen från AD-användaren och kopplar bort den lokala postlådan. Postlådedata finns kvar som disconnected mailbox tills databasens kvarhållningstid löper ut. Direkt därefter aktiverar Enable-RemoteMailbox samma AD-användare för Exchange Online.
Följande skript bearbetar endast dubbelt godkända rader. Det bevarar den primära SMTP-adressen, alla befintliga proxyadresser och den gamla LegacyExchangeDN som X500-adress. X500-posten förhindrar NDR:er vid svar på äldre meddelanden eller gamla poster i Outlooks autoslutförande.
$CsvPath = "C:\Migration\mailboxes.csv"
$PstShare = "\\fileserver\exchange-pst$"
$targets = Import-Csv $CsvPath |
Where-Object { $_.Action -eq "CUTOVER" -and $_.PstVerified -eq "YES" }
foreach ($row in $targets) {
$safeName = ($row.PrimarySmtpAddress -replace '[^a-zA-Z0-9@._-]', '_')
$pstPath = "$PstShare\$safeName.pst"
if (-not (Test-Path $pstPath)) {
throw "PST fehlt: $pstPath"
}
if ((Get-Item $pstPath).Length -eq 0) {
throw "PST ist leer: $pstPath"
}
$mailbox = Get-Mailbox -Identity $row.Identity -ErrorAction Stop
$primary = $mailbox.PrimarySmtpAddress.ToString()
$legacyDn = $mailbox.LegacyExchangeDN
if ($primary -ine $row.PrimarySmtpAddress) {
throw "Primaere SMTP-Adresse stimmt nicht mit der Freigabeliste ueberein: $($row.Identity)"
}
$preservedAddresses = @($mailbox.EmailAddresses | ForEach-Object ToString)
Disable-Mailbox -Identity $row.Identity -Confirm:$false
$enableParams = @{
Identity = $row.Identity
Alias = $row.Alias
PrimarySmtpAddress = $primary
RemoteRoutingAddress = $row.RemoteRoutingAddress
ACLableSyncedObjectEnabled = $true
}
switch ($row.SourceType) {
"SharedMailbox" { $enableParams.Shared = $true }
"RoomMailbox" { $enableParams.Room = $true }
"EquipmentMailbox" { $enableParams.Equipment = $true }
"UserMailbox" { }
default { throw "Nicht unterstuetzter Mailbox-Typ: $($row.SourceType)" }
}
Enable-RemoteMailbox @enableParams
$orderedAddresses = @(
"SMTP:$primary"
$preservedAddresses |
Where-Object { $_ -notmatch '^SMTP:' -or $_.Substring(5) -ine $primary }
"smtp:$($row.RemoteRoutingAddress)"
"X500:$legacyDn"
)
$seen = [System.Collections.Generic.HashSet[string]]::new(
[System.StringComparer]::OrdinalIgnoreCase
)
$finalAddresses = foreach ($address in $orderedAddresses) {
if ($seen.Add($address)) { $address }
}
Set-RemoteMailbox -Identity $row.Identity -EmailAddressPolicyEnabled $false
Set-RemoteMailbox -Identity $row.Identity -EmailAddresses $finalAddresses
Set-RemoteMailbox -Identity $row.Identity -PrimarySmtpAddress $primary
Get-RemoteMailbox -Identity $row.Identity |
Format-List DisplayName,RecipientTypeDetails,PrimarySmtpAddress,
RemoteRoutingAddress,EmailAddresses
}
Skriptet är med avsikt inte ett helautomatiskt migreringsverktyg. Det avbryter körningen vid den första motsägelsen så att en administratör kan bedöma orsak och tillstånd. Före en produktionsbatch bör koden valideras med några få testpostlådor och de Exchange-versioner som används.
Fas 4: Synkronisera, licensiera och verifiera
Efter den lokala ändringen startas en deltacykel på Entra Connect-servern:
Start-ADSyncSyncCycle -PolicyType Delta
För användarpostlådor måste därefter en giltig Exchange Online-tjänstplan vara tilldelad, exempelvis via gruppbaserad licensiering. Delade postlådor samt rums- och utrustningspostlådor ska bedömas enligt aktuella licensvillkor från Microsoft och de funktioner som behövs.
Etableringen är asynkron. Microsoft anger för normala ändringar vanligtvis mindre än 30 minuter, men i enskilda fall upp till 24 timmar. Under denna tid bör det föregående e-postflödet hålla kvar meddelanden kontrollerat i stället för att leverera dem till ett mål som ännu inte är klart.
Den lokala kontrollen måste nu visa en RemoteMailbox:
Get-RemoteMailbox -Identity user01@contoso.com |
Format-List RecipientTypeDetails,PrimarySmtpAddress,RemoteRoutingAddress,EmailAddresses
Get-Mailbox -Identity user01@contoso.com -ErrorAction SilentlyContinue
I Exchange Online kontrolleras om den tidigare MailUser har blivit en verklig postlåda:
Get-EXORecipient -Identity user01@contoso.com |
Format-List RecipientTypeDetails,PrimarySmtpAddress,EmailAddresses
Get-EXOMailbox -Identity user01@contoso.com |
Format-List RecipientTypeDetails,PrimarySmtpAddress,ExchangeGuid
Batchen räknas som slutförd först när även följande tester har lyckats:
- Leverans externt och internt
- Skickande externt och internt
- Svar på ett gammalt meddelande för att kontrollera X500-adressen
- Inloggning med Outlook och Outlook på webben
- Delegeringar och Send-As
- Vidarebefordringar och transportregler
- Rums- och utrustningsbokningar
- Applikationer, skannrar och SMTP-reläer
- Message Trace med leverans till den nya molnpostlådan
Återställning och rensning
Den lokala källpostlådan får inte raderas med Remove-StoreMailbox under valideringsfasen. Så länge den finns som disconnected mailbox inom postlådekvarhållningen finns fortfarande en teknisk återställningsmöjlighet. En återställning kräver dock en kontrollerad återställning av RemoteMailbox-attributen och återanslutning av den lokala postlådan; samtidigt måste det förhindras att två aktiva leveransmål uppstår.
Före en återställning ska därför e-postflöde, synkroniseringsstatus och meddelanden som redan mottagits i molnet säkras. Att växla tillbaka är ingen enkel enradare och ska ingå som ett testat runbook i ändringen.
Efter godkänd acceptans rensas exportbegäranden, PST-filer arkiveras enligt skydds- och kvarhållningskonceptet och tillfälliga behörigheter på exportresursen tas bort:
Get-MailboxExportRequest -BatchName $BatchName |
Remove-MailboxExportRequest -Confirm:$false
De disconnected mailboxes bör inte rensas slutgiltigt förrän det överenskomna återställningsfönstret har löpt ut och enligt kvarhållningskonceptet.
Slutsats
Om Hybrid Remote Moves inte är tillåtna och inga postlådedata behöver flyttas till Exchange Online kan en befintlig synkroniserad AD-användare kontrollerat ställas om från en lokal postlåda till en ny molnpostlåda. Den kritiska delen är inte Enable-RemoteMailbox, utan processkontrollen runt den: fullständig inventering, verifierad PST-säkerhetskopiering, uttryckliga godkännanden, bevarande av proxy- och X500-adresser, kontrollerat e-postflöde samt ett verkligt återställningsfönster.
Kommentarer
Kommentarerna hämtas från GitHub / Giscus.