Microsoft Exchange Online

Oppdatert:25. februar 2025

Her ligger begynnelsen på dokumentasjon / notater knyttet til oppsettet av Exchange Online. Kan med fordel gås igjennom og utvides...

Tilgang

Hvilke tilganger man har i MS365 kan man se i Entra administrasjonssenter under Priviliged Identity Manager. Innlogging med driftsbruker, bruk gjerne egen nettleser eller et privat vindu:

  • Exchange Administrator (de fleste e-postrelaterte oppgaver)
  • User Administrator (grupper, og da implisitt lisenser)
  • Global Admin (hybridoppsett og domener)
  • Identity Information Reader (innlogging?)

I tillegg til Entra administrasjonssenter, så brukes Exchange administrasjonssenter mye og det generelle Microsoft administrasjonssenter noe.

Entra administrasjonssenter: https://entra.microsoft.com Exchange administrasjonssenter: https://admin.exchange.microsoft.com Microsoft administrasjonssenter: https://admin.microsoft.com

For tilgang til Powershell for Exchange Online kan man, f.eks. fra mail-exmgmt02.exprod.uio.no:

Connect-ExchangeOnline -Prefix EO

Feilsøke migrasjon

Mottakermailboks mangler

Alle primærbrukere bør ha en korrespondernde konto i Entra ID, men det er vanlig at noen har sluttet i perioden mellom utplukket til migrasjon gjøres og det sendes e-post til den faktiske migrasjonen starter.

Dobbeltsjekk at brukeren ikke finnes i Entra ID og slett deretter flyttejobben/migrasjonen av brukeren.

Har allerede mailboks

Om en migrasjon feiler fordi det allerede finnes en mailboks i skyen så må det først fastslås at brukeren allerede er flyttet (og så f.eks. byttet jobb internt på UiO, altså fra en migrert enhet til en som skal opp).

Dette kan typisk gjøres med enten Get-Mailbox eller Get-RemoteMailbox kjørt på bakken.

Det neste steget er å se om mailboksen i Exchange Online inneholder data. Bruk f.eks. Get-MailboxStatistics mot skykontoen. Inneholder den data brukes et eDisovery til å søke oppe mailboksen, lage en eksport og så laste den ned. Det letteste er å gjøre nedlastingen med Edge.

Deretter må brukeren legges til en gruppe som gir riktig lisens (A1 eller A5), men uten Exchange Online. Noen minutter senere vil mailboksen i skyen være fjernet. Da kan man angi at migrasjonsjobben kan startes opp igjen.

Det finnes allerede en migrasjonsjobb

Om det allerede finnes en migrasjonsjobb, så kan det være at brukeren er migrert til skyen tidligere, men det vanligste er at flyttejobbene ikke er vasket. Det er ganske mange ansatte som også er tilknyttet. De kan naturlig nok ikke flyttes to ganger :)

Domenet mangler i sky

Om en migrasjonsjobb feiler fordi domenet (i primæradressen) ikke finnes i UiOs MS365-tenant, så må det legges til. Det er en egen rutine for dette.

Det er viktig at domenet settes til InternalRelay etter at det er lagt til, samt at man sjekker om det ligger i IntraOrganizationConnector.

Bruker har ikke en onmicrosoft.com-adresse

Alle brukere som skal migreres opp må ha fått en uio.mail.onmicrosoft.com-adresse siden det er denne som brukes for å levere e-post fra bakken til sky i hybridløsningen til Microsoft.

Tilpasninger

Skur av tilbakekalling av e-post

Tidligere var tilbakekalling av e-post noe Outlook gjorde, men Microsoft har flyttet funksjonliteten til tjenersiden i skyen. I praksis innebærer dette at når en bruker skal tilbakekalle en e-post så sendes det en spesielt utformet e-post til samme mottakere som opprinnelig. Denne vil parses av Exchange Online og e-posten fjernes fra mailboksene.

Vi skrudde av muligheten for dette når parsingen ble gjort i Outlook, og dette videreføres i skyen:

Set-OrganizationConfig -MessageRecallEnabled:$false

Verifisert med:

Get-OrganizationConfig | FL *recall*

MessageRecallMaxRecallableAge                       : 365.00:00:00
RecallReadMessagesEnabled                           :
MessageRecallEnabled                                : False
MessageRecallAlertRecipientsEnabled                 : False
MessageRecallAlertRecipientsReadMessagesOnlyEnabled : False

SpamAssassin overstyrer spamfiltrering i sky

TODO: Transportregler for X-UiO-Exchange-Junk (Yes/No).

Slett utgående lestbekreftelser

TODO: Transportregel for sletting av utgående «Read Recipent».

POP

For å skru av POP er følgende gjort:

Get-EOCASMailboxPlan | ft Name,Popenabled,IMAPEnabled

Name                                                          PopEnabled ImapEnabled
----                                                          ---------- -----------
ExchangeOnlineEnterprise-e18a9cc2-23b1-438e-948a-4299cee1a1a0       True        True
ExchangeOnline-d8ea1931-df1e-4191-af02-969300ae218a                 True        True
ExchangeOnlineDeskless-867e8005-9146-4ac8-ac08-5c60ef2a9787         True       False
ExchangeOnlineEssentials-1d42939f-126f-4142-83d9-7ba92fa30495       True        True

# Deaktiver POP i alle planer.
Get-EOCASMailboxPlan | Set-EOCASMailboxPlan -PopEnabled:$false

Get-EOCASMailboxPlan | ft Name,Popenabled,IMAPEnabled

Name                                                          PopEnabled ImapEnabled
----                                                          ---------- -----------
ExchangeOnlineEnterprise-e18a9cc2-23b1-438e-948a-4299cee1a1a0      False        True
ExchangeOnline-d8ea1931-df1e-4191-af02-969300ae218a                False        True
ExchangeOnlineDeskless-867e8005-9146-4ac8-ac08-5c60ef2a9787        False       False
ExchangeOnlineEssentials-1d42939f-126f-4142-83d9-7ba92fa30495      False        True

Deretter er det skrudd av for alle mailbokser som allerede er migrert:

$POPMailboxes = Get-CASMailbox -Filter { PopEnabled -eq $true }
ForEach ( $Id in ($POPMailboxes).Identity ) { Write-Host $Id }
ForEach ( $Id in ($POPMailboxes).Identity ) { Set-CASMailbox -Identity $Id -PopEnabled:$false }

To mailbokser feilet fordi «Identity» ikke var unik (matches multiple entries). Idiotsystem. Ble fikset med å angi UPN (selv om identiteten til en CASMailbox ikke angis som det).

Hvem er en Integrated App rullet ut for

Finn først ObjectId for applikasjonen:

Connect-AzureAD
Get-AzureADServicePrincipal -SearchString "Outlook plugin"

ObjectId                             AppId                                DisplayName
--------                             -----                                -----------
44cfd229-8741-4a1d-83f8-dc8578206be4 746755e7-1db1-4d7e-9c12-66c9cc017122 Outlook plugin for Elements

Deretter kan brukere og grupper listes ut:

Get-AzureADServiceAppRoleAssignment -ObjectId "44cfd229-8741-4a1d-83f8-dc8578206be4"

ObjectId                                    ResourceDisplayName         PrincipalDisplayName
--------                                    -------------------         --------------------
DYDm1ZHuR0-Xvt3q1xHvpqutQg43N21Iip5MrzRrxQY Outlook plugin for Elements Arul Narendran
etNPU6fCGU-MWx0GOwuy2daO9rxgELhCqIJ8sqic1bY Outlook plugin for Elements Kim Roar Kristiansen
n3kwII7cIkeRmGnuwOmOcFHP0WmRktRKhvwsIYlPQTM Outlook plugin for Elements  test-eSak-Elements-users-officeaddins

Ymse lisens

NB! Man må være User Administrator eller tilsvarende for å kunne fikse dette, samt koblet til både AzureAd og on-prem Exchange.

Identifiser brukere som manuelt har fått fjernet EO-lisens, men som nå er flyttet:

$a1 = "c332a947-15dc-4e18-8fb2-057358341db7"
$a5 = "9a29c219-7dc7-4a11-bd1b-37b8c25e8edb"

$a1uten = "28911ac8-df1b-4984-9375-05407c213fdc"
$a5uten = "b685fab2-6667-4fc7-af14-daae46c6d25a"

ForEach ($User in (Get-AzureADGroupMember -ObjectId $a1uten).UserPrincipalName) { Try { $Temp = Get-RemoteMailbox $User -ErrorAction:Stop; Write-Host $User } Catch { } }
ForEach ($User in (Get-AzureADGroupMember -ObjectId $a5uten).UserPrincipalName) { Try { $Temp = Get-RemoteMailbox $User -ErrorAction:Stop; Write-Host $User } Catch { } }

# Utvid til å fikse
ForEach ($User in (Get-AzureADGroupMember -ObjectId $a5uten).UserPrincipalName) { `
    Try { $Temp = Get-RemoteMailbox $User -ErrorAction:Stop; Write-Host $User; `
          $Member = (Get-AzureADUser -ObjectId $User).ObjectId; `
          Add-AzureADGroupMember -ObjectId $a5 -RefObjectId $Member; `
          Remove-AzureADGroupMember -ObjectId $a5uten -MemberId $Member; } `
     Catch { } }

Koble til Graph med sertifikat:

$GraphconnectionsParams = @{ 'Tenant' = '463b6811-b0a4-4b2a-b932-72c4c970c5d2'; 'CertificateThumbprint' =  'AE2DCDE7CD78E36EDB64B2E570230E62E3509827'; 'ClientId' = '73076ea6-3994-4765-af53-cb7f6cb0991a'; }

Connect-MgGraph @GraphconnectionsParams

Hent migrerte brukere:

$EOUsers = Get-RemoteMailbox -Filter { RecipientType -eq 'MailUser' -and RecipientTypeDetails -eq 'RemoteUserMailbox' } | Select SamAccountName

ForEach ($sam in $EOUsers.SamAccountName) { $ServicePlans = (Get-MgUserLicenseDetail -UserId $sam@uio.no).ServicePlans; $EOLisens = ([bool]($ServicePlans | where { $_.ServicePlanName -like "Exchange_S*" -and $_.ServicePlanName -notlike "EXCHANGE_S_FOUNDATION" -and $_.ProvisioningStatus -like "Success" })); If ( -not $EOLisens ) { Write-Host "FIKS $sam" } }

Oppdatert migrasjonsgruppe

For å sjekke om alle som ligger i postmaster-eo-migrerte faktisk er i Exchange Online:

Get-DistributionGroupMember postmaster-eo-migrerte -ResultSize Unlimited | Where { $_.RecipientType -ne "MailUser" } | FT Name, RecipientType -AutoSize

Name         RecipientType
----         -------------
thoni          UserMailbox
ingarv         UserMailbox
isaksen-test   UserMailbox

Dobbeltsjekk at thoni ikke burde være der:

Get-Mailbox thoni | ft -AutoSize

Name  Alias ServerName ProhibitSendQuota
----  ----- ---------- -----------------
thoni thoni mail-ex22  24.41 GB (26,214,400,000 bytes)

Ryddes så i Bofh, for eksempel:

bofh> group remove thoni postmaster-eo-migrerte
OK, removed 'thoni' from 'postmaster-eo-migrerte'

Deretter kan det være greit å sjekke at alle som er migrert faktisk ligger i gruppen. Unngå rom og den ene brukeren som er provisjonert direkte i EO. Gjøres ved å kun plukke ut brukerkontoer med status som migerert:

$Gruppenavn = "CN=postmaster-eo-migrerte,OU=Groups,OU=Cerebrum,DC=exprod,DC=uio,DC=no"
$EOusers = Get-RemoteMailbox -ResultSize Unlimited -Filter { RemoteRecipientType -eq "Migrated" -and RecipientTypeDetails -eq "RemoteUserMailbox" }

ForEach ( $User in $EOusers.SamAccountName ) { If ( $Gruppenavn -notin (Get-ADUser $User -Properties *).MemberOf ) { Write-Host "$User" } }

Oppdatert GAL

Som standard inneholder Global Address List grupper, og ettersom hvemsomhelst kan opprette de (og gi de ufine/misledene navn) så bør de ikke dukke opp i den globale adresselisten.

Før endring så det slik ut:

PS /home/iv-drift> Get-GlobalAddressList

Name                        RecipientFilter
----                        ---------------
Default Global Address List ((Alias -ne $null) -and (((ObjectClass -eq 'user') -or (ObjectClass -eq 'contact') `
    -or (ObjectClass -eq 'msExchSystemMailbox') -or (ObjectClass -eq 'msExchDynamicDistributionList') `
    -or (ObjectClass -eq 'group') -or (ObjectClass -eq 'publicFolder'))))

Vi har endret til:

((Alias -ne $null) -and ((ObjectClass -eq 'user') -or (ObjectClass -eq 'contact') -or (ObjectClass -eq 'msExchSystemMailbox') -or (ObjectClass -eq 'group')) -and (-not(RecipientTypeDetailsValue -eq 'GroupMailbox')))

Offline GAL:

((Alias -ne $null) -and (((((((((((ObjectClass -eq 'user') -or (ObjectClass -eq 'contact'))) -or (ObjectClass -eq 'msExchSystemMailbox'))) `
    -or (ObjectClass -eq 'msExchDynamicDistributionList'))) -or (ObjectClass -eq 'group'))) -or (ObjectClass -eq 'publicFolder'))))

Endret til:

Get-AddressList -Identity "Offline Global Address List" | Set-AddressList -RecipientFilter `
    '((Alias -ne $null) -and ((ObjectClass -eq "user") -or (ObjectClass -eq "contact") -or (ObjectClass -eq "msExchSystemMailbox") -or (ObjectClass -eq "group")) -and (-not(RecipientTypeDetailsValue -eq "GroupMailbox")))'

All Distribution Lists:

((Alias -ne $null) -and (ObjectCategory -like 'group'))

Endret til:

Get-AddressList -Identity "All Distribution Lists" | Set-AddressList -RecipientFilter `
    '(Alias -ne $null) -and (ObjectCategory -like "group") -and (-not(RecipientTypeDetailsValue -eq "GroupMailbox"))'

Tilpasse retentionpolicy

La folk ha lang sommerferie uten å bekymre seg:

Set-RetentionPolicyTag -Identity "Junk Email" -AgeLimitForRetention "45.00:00:00"

Justere sperrede filtyper

2025-02-24 - fjerner .py og .vhd fra listen:

Set-OwaMailboxPolicy -Identity OwaMailboxPolicy-Default -blockedfiletypes @{remove=".py", ".vhd"}

Ymse manuelle fikser

Reprovision RemoteMailbox

Hvis man er helt sikker på at en bruker er slettet for godt i Exchange Online, men Exchange på bakken ikke har fått det med seg, så kan man provisjonere en ny blank mailboks direkte i sky.

Eksempel:

# Angi brukerkontor.

    $UserName = "kristojw"

# Dump eksisterende informasjon.

    $formatenumerationlimit = -1
    Get-RemoteMailbox $UserName | fl > "${UserName}.txt"

# Verifiser at Exchange on-prem har brukeren.

    Get-RemoteMailbox $UserName | ft -AutoSize

    Name     RecipientTypeDetails RemoteRecipientType
    ----     -------------------- -------------------
    kristojw RemoteUserMailbox    Migrated

Dobbeltsjekk deretter at brukeren har Exchange Online-lisens + at det ikke er noen mailboks i sky. Om man er helt sikker, fortsett:

# Hent ut adresser.

    $PrevAddresses = (Get-RemoteMailbox $UserName).EmailAddresses.ProxyAddressString

    $PrevAddresses

    x500:/o=ExchangeLabs/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=9d1f7d7bcf2d4aa5a592bbc34e37b26b-3845521a-48
    X500:/o=University of Oslo/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=ea078db4f63641d2abb7a65fe29d1e1d-krist
    smtp:kristojw@uio.mail.onmicrosoft.com
    x500:/o=ExchangeLabs/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=e84f92e7ac0b4cb19a97417c398e2e7a-kristojw
    smtp:kristojw@psykologi.uio.no
    smtp:kristojw@student.sv.uio.no
    SMTP:k.j.whittaker@psykologi.uio.no
    smtp:kristojw@uio.no
    smtp:kristojw@ulrik.uio.no
    smtp:kristojw@mail.uio.no

    $PrevPrimary = (Get-RemoteMailbox $UserName).PrimarySmtpAddress.Address

    $PrevPrimary

    k.j.whittaker@psykologi.uio.no

# Fjern gammel «mailboks», men ikke bruker.

    Disable-RemoteMailbox $UserName

# Lag på nytt.

    Enable-RemoteMailbox -Identity $UserName -RemoteRoutingAddress "${UserName}@uio.mail.onmicrosoft.com"

# Legg til adresser på nytt.

    ForEach ( $OldAddress in $PrevAddresses.Replace('SMTP','smtp') ) { Set-RemoteMailbox -Identity $UserName -EmailAddresses @{Add="$OldAddress"} }

# Set primæradresse på nytt.

    Set-RemoteMailbox -Identity $UserName -EmailAddressPolicyEnabled:$false
    Set-RemoteMailbox -Identity $UserName -WindowsEmailAddress "$PrevPrimary"


# Sjekk innstillinger.

    Get-RemoteMailbox $UserName | ft -AutoSize

    Name     RecipientTypeDetails RemoteRecipientType
    ----     -------------------- -------------------
    kristojw RemoteUserMailbox    ProvisionMailbox


    Get-RemoteMailbox $UserName | fl *addr*

    RemoteRoutingAddress          : SMTP:kristojw@uio.mail.onmicrosoft.com
    ForwardingAddress             :
    JournalArchiveAddress         :
    AddressListMembership         : {\All Users, \All Recipients(VLV), \Default Global Address List}
    EmailAddresses                : {smtp:kristojw@mail.uio.no, SMTP:k.j.whittaker@psykologi.uio.no,
                                     smtp:kristojw@ulrik.uio.no, smtp:kristojw@uio.no, smtp:kristojw@student.sv.uio.no,
                                     smtp:kristojw@psykologi.uio.no,
                                     x500:/o=ExchangeLabs/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=e84f92e7ac0b4cb19a97417c398e2e7a-kristojw,
                                     X500:/o=University of Oslo/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=ea078db4f63641d2abb7a65fe29d1e1d-krist,
                                     x500:/o=ExchangeLabs/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=9d1f7d7bcf2d4aa5a592bbc34e37b26b-3845521a-48,
                                     smtp:kristojw@uio.mail.onmicrosoft.com}
    HiddenFromAddressListsEnabled : False
    EmailAddressPolicyEnabled     : False
    PrimarySmtpAddress            : k.j.whittaker@psykologi.uio.no
    WindowsEmailAddress           : k.j.whittaker@psykologi.uio.no


# Sjekk i Exchange Online. Vent 5-15 minutter...

    Get-Mailbox kristojw@uio.no | ft -AutoSize

    Name                                 Alias    Database           ProhibitSendQuota             ExternalDirectoryObjectId
    ----                                 -----    --------           -----------------             -------------------------
    3845521a-4859-44cc-80f1-14659d3acbbb kristojw NORP279DG042-db207 99 GB (106,300,440,576 bytes) 3845521a-4859-44cc-80f1-14659d3acbbb

Til slutt. Legg inn i migrert-gruppen:

bofh> group add kristojw postmaster-eo-migrerte
OK, added 'kristojw' to 'postmaster-eo-migrerte'