EXO-migrering uten Remote Move
Slik klargjøres lokale Exchange-postbokser kontrollert som nye, tomme postbokser i Exchange Online: PST-sikkerhetskopi, CSV-godkjenning, RemoteMailbox, synkronisering, validering og tilbakeføring.
En Hybrid Remote Move er den vanlige måten å flytte en lokal Exchange-postboks med innhold til Exchange Online på. Ikke alle organisasjoner tillater denne migreringsveien. Dersom en sikkerhetspolicy utelukker Remote Moves, kan en bevisst annerledes tilnærming være forsvarlig: Den lokale postboksen sikkerhetskopieres som PST, kobles fra den synkroniserte AD-brukeren, og det klargjøres en ny, tom postboks i Exchange Online for samme bruker.
Denne veien er ikke en postboksmigrering. Den overfører verken meldinger, kalendere, regler eller tillatelser til skyen. PST-filen brukes kun som sikkerhetskopi og importeres ikke i dette scenarioet. Fremgangsmåten egner seg derfor bare dersom en tom målpostboks er faglig akseptabel, og tapet av den aktive postboks-konfigurasjonen er uttrykkelig godkjent.
Måltilstand og ufravikelige forutsetninger
Etter cutover beholdes samme AD-bruker. Lokalt administreres den imidlertid ikke lenger som UserMailbox, SharedMailbox, RoomMailbox eller EquipmentMailbox, men som RemoteMailbox. Etter synkroniseringen representerer dette objektet den nye postboksen i Exchange Online.
Ønsket tilstand ser slik ut:
- Den lokale postboksen er fullstendig sikkerhetskopiert som PST.
- Den lokale postboksen er frakoblet, men ikke endelig slettet innenfor den konfigurerte retention-perioden.
- Den eksisterende AD-brukeren er aktivert som RemoteMailbox.
- Primæradresse, aliaser og den gamle
LegacyExchangeDNbeholdes. - Entra Connect har synkronisert endringene.
- En Exchange Online-tjenesteplan er tilordnet brukerpostbokser.
- Exchange Online viser en ekte skypostboks, og e-postflyten ender der.
Følgende må også være avklart før oppstart:
- PST-delingen er tilgjengelig via UNC. Gruppen
Exchange Trusted Subsystemhar lese- og skrivetilgang der. - Kontoen som utfører arbeidet, har administrasjonsrollen
Mailbox Import Export. - PST-filen er kun den avtalte sikkerhetskopien; ingen senere import er planlagt.
- Oppbevaring, Litigation Hold, eDiscovery og regulatoriske krav er kontrollert separat.
- Delegeringer, Send-As, Send-on-Behalf, videresendinger, innboksregler, mobile enheter og applikasjonstilganger er kartlagt.
- Under eksport og omkobling holdes innkommende meldinger kontrollert tilbake i den foranliggende gatewayen. Brukere og applikasjoner må ikke lenger skrive til kildepostboksen.
- Retention for den lokale postboksdatabasen dekker tilbakeføringsvinduet.
Hvorfor en CSV-godkjenningsliste er uunnværlig
En direkte pipeline som Get-Mailbox | Disable-Mailbox er for risikabel for denne operasjonen. Den kan også inkludere system-, Discovery- eller andre ikke-godkjente postbokser. Den følgende prosessen arbeider derfor med to eksplisitte godkjenninger:
Action=CUTOVERangir hvilken rad som faktisk kan omstilles.PstVerified=YESbekrefter at eksportfilen er kontrollert teknisk og organisatorisk.
Først opprettes bare inventaret:
$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 renses deretter faglig. Bare postbokser som faktisk er godkjent, får Action=CUTOVER. Systempostbokser og spesialobjekter hører ikke hjemme i denne listen.
Fase 1: Sikkerhetskopier primærpostboks og arkiv som PST
New-MailboxExportRequest skriver bare til en UNC-bane. Det opprettes et entydig filnavn for hver postboks. Et aktivt nettarkiv i lokal Exchange eksporteres 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
}
}
Eksporten er først godkjent når alle forespørsler har status 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"
I tillegg må filenes eksistens, størrelse, lesbarhet, overføring til sikkerhetskopi og tilgangsbeskyttelse kontrolleres. Først deretter settes PstVerified=YES for den aktuelle CSV-raden.
Fase 2: Sikkerhetskopier postboksdata og Exchange-attributter
Før den første endringen opprettes et maskinlesbart øyeblikksbilde per postboks. Det er viktigere enn et skjermbilde, fordi aliaser, GUID-er og LegacyExchangeDN senere kan rekonstrueres nøyaktig:
$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"
}
Delegeringer og videresendinger krever egne eksporter. Minst denne informasjonen bør sikkerhetskopieres 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
Disse konfigurasjonene flyttes ikke automatisk til den nye skypostboksen.
Fase 3: Koble fra lokal postboks og aktiver RemoteMailbox
Selve cutoveren er kort, men konsekvensrik. Disable-Mailbox fjerner Exchange-attributtene fra AD-brukeren og kobler fra den lokale postboksen. Postboksdataene beholdes som en disconnected mailbox frem til databaseretentionen utløper. Rett etterpå aktiverer Enable-RemoteMailbox samme AD-bruker for Exchange Online.
Det følgende skriptet behandler utelukkende dobbelt godkjente rader. Det bevarer den primære SMTP-adressen, alle eksisterende proxy-adresser og den gamle LegacyExchangeDN som X500-adresse. X500-oppføringen forhindrer NDR-er ved svar på eldre meldinger eller gamle Outlook-autofullføringsoppføringer.
$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 er bevisst ikke et helautomatisk migreringsverktøy. Det avslutter kjøringen ved den første uoverensstemmelsen, slik at en administrator kan vurdere årsak og tilstand. Før en produksjonsbatch bør koden valideres med noen få testpostbokser og Exchange-versjonene som brukes.
Fase 4: Synkroniser, lisensier og verifiser
Etter den lokale endringen startes en delta-syklus på Entra Connect-serveren:
Start-ADSyncSyncCycle -PolicyType Delta
For brukerpostbokser må det deretter være tilordnet en gyldig Exchange Online-tjenesteplan, for eksempel via gruppebasert lisensiering. Delte postbokser, rom- og utstyrspostbokser må vurderes i henhold til gjeldende Microsoft-lisensvilkår og nødvendige funksjoner.
Klargjøringen er asynkron. Microsoft oppgir vanligvis under 30 minutter for normale endringer, men i enkelttilfeller opptil 24 timer. I løpet av denne tiden bør den foranliggende e-postflyten holde meldinger kontrollert tilbake i stedet for å levere dem til et mål som ennå ikke er klart.
Den lokale kontrollen må nå vise 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 kontrolleres det om den tidligere MailUser har blitt en ekte postboks:
Get-EXORecipient -Identity user01@contoso.com |
Format-List RecipientTypeDetails,PrimarySmtpAddress,EmailAddresses
Get-EXOMailbox -Identity user01@contoso.com |
Format-List RecipientTypeDetails,PrimarySmtpAddress,ExchangeGuid
Batchen anses først som fullført når følgende tester i tillegg er vellykkede:
- Levering eksternt og internt
- Sending eksternt og internt
- Svar på en gammel melding for å kontrollere X500-adressen
- Innlogging med Outlook og Outlook på nettet
- Delegeringer og Send-As
- Videresendinger og transportregler
- Rom- og utstyrsbestillinger
- Applikasjoner, skannere og SMTP-reléer
- Message Trace med levering til den nye skypostboksen
Tilbakeføring og opprydding
Den lokale kildepostboksen må ikke slettes med Remove-StoreMailbox i valideringsfasen. Så lenge den finnes som disconnected mailbox innenfor postboksretentionen, finnes det fortsatt en teknisk mulighet for tilbakeføring. En tilbakeføring krever imidlertid en kontrollert reversering av RemoteMailbox-attributtene og ny tilkobling av den lokale postboksen; samtidig må det forhindres at to aktive leveringsmål oppstår.
Før en tilbakeføring må derfor e-postflyt, synkroniseringsstatus og meldinger som allerede er mottatt i skyen, sikres. Et tilbakebytte er ikke en enkel énløser og må inngå som et testet runbook i endringen.
Etter vellykket godkjenning ryddes eksportforespørsler opp, PST-filer arkiveres i henhold til beskyttelses- og oppbevaringskonseptet, og midlertidige tillatelser på eksportdelingen fjernes:
Get-MailboxExportRequest -BatchName $BatchName |
Remove-MailboxExportRequest -Confirm:$false
De frakoblede postboksene bør først ryddes endelig etter at det avtalte tilbakeføringsvinduet er utløpt og i henhold til retention-konseptet.
Konklusjon
Når Hybrid Remote Moves ikke er tillatt og ingen postboksdata må overføres til Exchange Online, kan en eksisterende synkronisert AD-bruker kontrollerte omstilles fra en lokal postboks til en ny skypostboks. Den kritiske delen er ikke Enable-RemoteMailbox, men prosesskontrollen rundt det: fullstendig inventarisering, verifisert PST-sikkerhetskopi, eksplisitte godkjenninger, bevaring av proxy- og X500-adresser, kontrollert e-postflyt og et reelt tilbakeføringsvindu.
Kommentarer
Kommentarene lastes inn fra GitHub / Giscus.