7. august 2026 12 min. lesetid

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:

  1. Den lokale postboksen er fullstendig sikkerhetskopiert som PST.
  2. Den lokale postboksen er frakoblet, men ikke endelig slettet innenfor den konfigurerte retention-perioden.
  3. Den eksisterende AD-brukeren er aktivert som RemoteMailbox.
  4. Primæradresse, aliaser og den gamle LegacyExchangeDN beholdes.
  5. Entra Connect har synkronisert endringene.
  6. En Exchange Online-tjenesteplan er tilordnet brukerpostbokser.
  7. 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 Subsystem har 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=CUTOVER angir hvilken rad som faktisk kan omstilles.
  • PstVerified=YES bekrefter 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
Forklaring av alternativer
AlternativVirkning
Get-Mailbox -ResultSize UnlimitedOpphever standardgrensen på 1000 resultater; uten denne parameteren mangler postbokser i inventaret i store miljøer
-RecipientTypeDetails UserMailbox,SharedMailbox,RoomMailbox,EquipmentMailboxBegrenser spørringen til de fire postbokstypene som skal omstilles; system- og Discovery-postbokser holdes utenfor
Sort-Object PrimarySmtpAddressSorterer utdata etter den primære SMTP-adressen, slik at CSV-filen er stabilt sortert ved faglig gjennomgang
Export-Csv -PathMålbane for CSV-filen
-NoTypeInformationUndertrykker typeoverskriften #TYPE ..., som eldre PowerShell-versjoner ellers skriver som første linje
-Encoding UTF8Skriver filen UTF-8-kodet, slik at spesialtegn i visningsnavn bevares korrekt

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
    }
}
Forklaring av alternativer
AlternativVirkning
Import-Csv $CsvPathLeser inn godkjenningslisten; hver rad blir et objekt med CSV-kolonnene som egenskaper
Where-Object Action -eq "CUTOVER"Behandler bare eksplisitt godkjente rader
New-MailboxExportRequest -MailboxKildepostboks for eksporten (her identiteten fra CSV-raden)
-FilePathMålbane for PST-filen; må være en UNC-bane, lokale baner avvises av cmdleten
-NameEntydig navn på forespørselen; muliggjør senere målrettet tilordning av primær- og arkiveksport
-BatchNameSamler alle forespørsler fra én kjøring under et batchnavn; grunnlag for statusspørring og opprydding
-IsArchiveEksporterer nettarkivet i stedet for primærpostboksen; derfor den andre forespørselen per postboks med aktivt arkiv

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"
Forklaring av alternativer
AlternativVirkning
Get-MailboxExportRequest -BatchNameViser alle eksportforespørsler for den angitte batchen
Get-MailboxExportRequestStatistics -IncludeReportSupplerer statistikken med den detaljerte historikkrapporten, som inneholder feilårsaker for enkeltforespørsler
Format-Table ... -AutoSizeTabellarisk visning av de angitte egenskapene; -AutoSize tilpasser kolonnebreddene til innholdet
Where-Object Status -ne "Completed"Filtrerer på alle forespørsler som ennå ikke er fullført eller som har feilet; utdata må være tomme før du fortsetter

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"
    }
Forklaring av alternativer
AlternativVirkning
New-Item -ItemType Directory -Path ... -ForceOppretter snapshot-katalogen; -Force undertrykker feilen dersom den allerede finnes
Get-Mailbox -IdentityHenter gjeldende postboksobjekt for den aktuelle CSV-raden
Select-Object Identity,...,ServerNameReduserer objektet til attributtene som kreves for senere rekonstruksjon (GUID-er, adresser, LegacyExchangeDN, database)
Export-ClixmlSerialiserer objektet som typebevarende CLIXML; i motsetning til CSV beholdes flerverdier som EmailAddresses fullstendig og kan leses inn igjen med Import-Clixml

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
Forklaring av alternativer
AlternativVirkning
Format-List ForwardingAddress,ForwardingSmtpAddress,DeliverToMailboxAndForwardViser postboksens tre videresendingsattributter i listevisning
Get-MailboxPermission -IdentityViser postbokstillatelser som Full Access
Get-ADPermission -IdentityViser AD-tillatelser på brukerobjektet, inkludert Send-As; forventer her Distinguished Name
Get-InboxRule -MailboxViser postboksens serverbaserte innboksregler
Get-CalendarProcessing -IdentityViser bestillingskonfigurasjonen; relevant for rom- og utstyrspostbokser
-ErrorAction SilentlyContinueUndertrykker feilen for postbokstyper uten bestillingskonfigurasjon, slik at sikkerhetskopieringen ikke avbrytes

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
}
Forklaring av alternativer
AlternativVirkning
Get-Mailbox -Identity ... -ErrorAction StopHenter kildepostboksen; -ErrorAction Stop gjør en oppslagsfeil til en avbrytende feil i stedet for å fortsette stille
Disable-Mailbox -IdentityFjerner Exchange-attributtene fra AD-brukeren og kobler fra den lokale postboksen; dataene beholdes som en disconnected mailbox i databasen
-Confirm:$falseUndertrykker det interaktive spørsmålet; godkjenningen skjer her via CSV-listen, ikke i ledeteksten
Enable-RemoteMailbox -IdentityAktiverer samme AD-bruker som RemoteMailbox for Exchange Online
-AliasSetter Exchange-aliaset tilbake til verdien fra godkjenningslisten
-PrimarySmtpAddressBevarer den tidligere primære SMTP-adressen
-RemoteRoutingAddressMåladresse i mail.onmicrosoft.com-rutingsdomenet, som den lokale Exchange bruker for å nå skypostboksen
-ACLableSyncedObjectEnabledMerker objektet som ACL-kompatibelt, slik at tillatelser som Full Access kan evalueres i Exchange Online etter synkronisering
-Shared / -Room / -EquipmentOppretter den aktuelle spesialtypen i stedet for en brukerpostboks; skriptet setter nøyaktig én bryter som passer kildetypen
Set-RemoteMailbox -EmailAddressPolicyEnabled $falseUnntar objektet fra e-postadressepolicyen, slik at den ikke overskriver manuelt angitte adresser
-EmailAddressesSetter den komplette, dedupliserte adresselisten, inkludert gamle proxy-adresser, rutingsadresse og X500-oppføring
Get-RemoteMailbox -IdentityKontrollspørring av resultatet rett etter omstillingen

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
Forklaring av alternativer
AlternativVirkning
-PolicyType DeltaSynkroniserer bare objekter som er endret siden forrige syklus; alternativet Initial ville vært en fullstendig og betydelig lengre kjøring

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
Forklaring av alternativer
AlternativVirkning
Get-RemoteMailbox -IdentityMå returnere det omstilte objektet som RemoteMailbox
Format-List RecipientTypeDetails,...Viser type, adresser og rutingsadresse for kontroll i listevisning
Get-Mailbox -Identity ... -ErrorAction SilentlyContinueMotkontroll: Kallet må ikke returnere noe, fordi det ikke lenger finnes en tilkoblet postboks lokalt; -ErrorAction SilentlyContinue undertrykker den forventede feilmeldingen

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
Forklaring av alternativer
AlternativVirkning
Get-EXORecipient -IdentityViser mottakertypen i Exchange Online; forventet er UserMailbox eller spesialtypen, ikke lenger MailUser
Get-EXOMailbox -IdentityReturnerer bare ekte skypostbokser; et treff beviser at klargjøringen er fullført
Format-List ...,ExchangeGuidViser kontrollattributtene; ExchangeGuid identifiserer den nye skypostboksen entydig

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
Forklaring av alternativer
AlternativVirkning
Get-MailboxExportRequest -BatchNameVelger nøyaktig eksportforespørslene for den fullførte batchen
Remove-MailboxExportRequest -Confirm:$falseFjerner forespørslene uten spørsmål; selve PST-filene påvirkes ikke av dette

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.

Kilder

  1. Microsoft Learn – Enable-RemoteMailbox

    Aktiverer en eksisterende lokal AD-bruker for en postboks i den skybaserte tjenesten og dokumenterer bryterne for bruker-, delte, rom- og utstyrspostbokser.

    https://learn.microsoft.com/en-us/powershell/module/exchange/enable-remotemailbox?view=exchange-ps
  2. Microsoft Learn – New-MailboxExportRequest

    Referanse for eksport av primære og arkiverte lokale postbokser til PST-filer.

    https://learn.microsoft.com/en-us/powershell/module/exchangepowershell/new-mailboxexportrequest?view=exchange-ps
  3. Microsoft Learn – Mailbox import and export requests

    Forutsetninger for eksportdeling, tillatelser og Exchange Trusted Subsystem.

    https://learn.microsoft.com/en-us/exchange/mailbox-import-and-export-requests-exchange-2013-help
  4. Microsoft Learn – Disable or delete a mailbox in Exchange Server

    Virkemåte for Disable-Mailbox, fjerning av Exchange-attributter og oppbevaring av den frakoblede postboksen.

    https://learn.microsoft.com/en-us/exchange/recipients/disconnected-mailboxes/disable-or-delete-mailboxes
  5. Microsoft Learn – Disconnected mailboxes

    Ny tilkobling, gjenoppretting og endelig sletting av frakoblede postbokser.

    https://learn.microsoft.com/en-us/exchange/recipients/disconnected-mailboxes/disconnected-mailboxes
  6. Microsoft Learn – Delays in provisioning of a user or mailbox
  7. Microsoft Learn – Move mailboxes between on-premises and Exchange Online organizations

    Den ordinære Hybrid Remote Move som referanse og avgrensning mot nyopprettingen beskrevet her.

    https://learn.microsoft.com/en-us/exchange/hybrid-deployment/move-mailboxes

Kommentarer

Kommentarene lastes inn fra GitHub / Giscus.