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'