Externe Member, Gast, Kontakt
Diese Seite beschäftigst sich mit den vier grundlegenden Benutzerkonten im EntraID, den Exchange Kontakten und deren Verwendung in Exchange/Outlook und Teams. Dies ist besonders interessant für Multi-Tenant-Umgebungen mit Verzeichnisabgleich.
Diese Seite hantiert mit vielen Benutzerobjekten und ich warne gleich. Sie ist nicht einfach zu verstehen, weil auch das Thema nicht trivial ist
Einstieg
Die meisten Microsoft 365 Administratoren wissen, dass zum Zugriff auf Cloud-Dienste eine Authentifizierung und Autorisierung erfolgen muss und dazu ein Benutzerkonto im EntraID vorliegen muss. Dies kann entweder ein "Cloud Only"-Konto sein, welches ein Administrator oder Provisioning-Prozess direkt in der Cloud angelegt hat oder ein vom lokalen Active Directory z.B. mit ADSync / AADConnect synchronisiert wurde. Das ist aber nur ein Teil, denn wer Benutzern aus anderen Tenants die Mitarbeiter gestatten möchte, kann diese als "Externe Gäste" einladen. Wussten Sie aber auch, dass es zudem "Interne Gäste" aber auch "externe Mitglieder" gibt und weil das alles noch nicht genug ist, können Sie noch EntraID-Kontakte anlegen, die Sie im Entra ID-Portal gar nicht sehen können. Das geht dann nur per PowerShell, Exchange Management, Graph und andere APIs. All diese Objekte haben aber sehr wohl eine Funktion und Sichtbarkeit in Microsoft Teams und Exchange Online.
Wenn nun eine Firma mit mehreren Tenants arbeitet, dann gehört ein Verzeichnisabgleich zwischen zwei Tenants eigentlich zum guten Ton, d.h. die Postfächer und Verteiler eines Tenants erscheinen beim anderen Tenant als Kontakte und/oder Gäste. Cross-Tenant Sync ist z.B. eine Komponente aber nicht die einzige Lösung und schon gar nicht perfekt. Diese Seite soll das Verständnis fördern, so dass sie die richtige Konfiguration für ihre Umgebung finden.
Spoiler: Cross-Tenant Sync funktioniert genial für Die Zusammenarbeit mit Teams aber hilft ihnen nicht beim Abgleich von Exchange Empfängern zwischen Tenants. Für einen "Tenant GalSync" gibt es keine eingebaute Lösug von Microsoft. Wenn beide Seiten "Exchange Hybrid" nutzen, sollten Sie die beiden OnPremises Umgebungen mit einem GalSync versehen, damit ADSync auch die Objekte in den Tenant abgleicht.
Ansonsten können sie sich gerne an meine Kollegen oder mich bei Net at Work wenden.
Übersicht
Von den fünf Benutzertypen, die eine Person repräsentieren können, habe ich die "Internal Gast" ausgeklammert, denn ich kenne keinen Fall, in dem ich diesen Type schon einmal genutzt habe und kann mir aktuell auch keinen Anwendungsfall vorstellen.
Wenn einer meiner Leser mit "Internal Guests" arbeitet, dann würde mich die Begründung interessieren. Kontakt
Die anderen vier Personen-Objekte habe ich aber regelmäßig im Gebrauch.
Verwaltung durch | Interne Member | External Gast | Externer Member | Contact |
---|---|---|---|---|
Kurzfassung |
Das sind ihre eigenen regulären Anwender, die als CloudOnly oder DirSync Konten angelegt werden und sich gegen ihre AzureAD authentifizieren. |
Sie können Gäste regulär "einladen", damit diese z.B. in Microsoft Teams Kanälen mitarbeiten können. Sie sind aber in der Funktion an verschiedenen Stellen eingeschränkt. |
Sie können aber auch externe Identitäten i ihrem Tenant als "Member" einladen. Es ist quasi ein Gast aber mit Rechten eines Members. |
Schon immer können Sie externe Kontakte im Outlook Adressbuch über serverseitige Kontaktobjekte anlegen. Sie sich aber nicht anmelden können. |
EntraID Portal |
Add
(Invite) Edit Delete |
Add Edit Delete |
Add
(Invite) Edit Delete |
Unsichtbar!. Sie sehen die Kontakte nicht in der Admin Portal. |
AzureAD PowerShell |
Add Edit Delete |
Add Edit Delete |
Add Edit Delete |
kein
ADD !! Edit Delete |
Exchange Online PowerShell |
Get-User Enable Disable |
GuestMailUser |
Get-User Enable Disable |
Add Edut Delete |
Sichtbar im Exchange GAL |
Ja, wenn Mailbox oder MailUser | Default Nein | Ja | Ja, wenn Mailcontact |
Anmeldung |
Ja | Über Hometenant |
Ja | Nein |
Regelfall Meist nur Admins als CloudOnly User |
Nein | Nein | Möglich, Empfohlen bei Exchange Hybrid | |
Entfällt |
Optional |
Default |
Nein | |
Teams Kanalnutzung |
Ja | Ja | Ja | Nein |
Teams Federation |
User Awareness | User Awareness | User Awareness | Objekt nicht sichtbar |
Mitgliedschaft in Gruppen/Verteiler |
DirSync CloudOnly |
Nur CloudOnly | Nur CloudOnly |
DirSync CloudOnly |
Mitgliedschaft in Teams |
Ja | Ja |
Nicht
Supported? Typ-Wechsel nicht supportet? |
Nein |
ProxyAddresse |
Ja | Nein (?) | Nein (?) | Ja |
Auswirkungen
Die unterschiedlichen Nutzungsmöglichkeiten haben natürlich direkt Einfluss auf verschiedene Produkte und Module, speziell beim Einsatz mit mehreren Tenants, ADSync und Cross Tenant Sync . Hier ein paar Beispiele:
- Exchange Adressbuch
Wenn Sie Empfänger aus einem anderen Tenant oder System in ihrem Exchange Online Adressbuch sichtbar machen wollen, dann geht dies nur über Kontakte oder Member. Gäste sind nicht im Exchange Adressbuch sichtbar - Teams Mitglieder
Offizielle können nur reguläre Mitglieder und Gäste in einem Team mitarbeiten - Federation und Gäste
Wenn ein Benutzer in einem anderen Tenant mit Teams arbeitet und keinen Gast in ihrem Tenant hat, können ihre Anwender über Federation mit ihm kommunizieren. Sobald es aber einen Gast gibt, werden die Anwender das Gastkonto als Ziel nutzen. Das kann gut und gewollt sein, wenn Sie als Firma auf Federation verzichten und alle Daten in ihrem Tenant bleiben sollen. Für den externen Mitarbeiter bedeutet dies aber, dass er den Tenant wechseln muss, um zu chatten und er mit einem unterschiedlichen Status arbeitet - Exchange Kontakte anlegen
Für jeden Exchange Online Kontakt gibt es auch ein Objekt im EntraID. Allerdings können Sie EntraID-Kontakte nicht per PowerShell oder API anlegen. Das geht nur über Exchange Online, welches dann auch das EntraID-Objekt anlegt - Doppeleinträge
Einige Elemente können sogar doppelt angelegt werden aber andere wieder nicht. So muss z.B. die "ProxyAddress" oder der UPN im Tenant eindeutig sein und das kann schon zu Konflikten mit Exchange Kontakten und Gasteinladungen führen. - Cross Tenant Sync legt keine Kontakte an
Wenn sie einfach nur die Empfänger eines Tenant als Exchange Empfänger im Outlook Adressbuch sehen wollen, dann könnte Cross-Tenant Sync
Es gibt sicher noch viele andere Konfliktfälle, die ich nach und nach ergänze.
Test 1: MailContact
Um die Thematik etwas zu beleuchten, habe ich eine kleine Testserie durchgeführt. Ich starte mit einem Exchange Kontakt, der entweder per ADSync oder CloudOnly-Objekt angelegt wird. Das ist ein häufiges Szenario, wenn zwei Firmen mit engerem Kontakt ihre Empfänger abgleichen wollen. Entweder bauen Sie eine entsprechende Lösung auf dem lokalen AD/Exchange auf und lassen ADSync die Kontakte in die Cloud replizieren oder sie lassen die Kontakte direkt in Microsoft 365 verwalten. Ich habe einfach einen Kontakt als "MailContact" über das Exchange Online Portal angelegt.
Quelle:
https://admin.exchange.microsoft.com
Das Exchange Online Portal erlaubt ihnen auch die Anlage eines "MailUser", was dann einen regulären CloudOnly-Benutzerkonto in ihrem Tenant anlegt. Ich habe ihn "Cloudcontact1" genannt und eine SMTP-Zieladresse angegeben.
In der Folge nutze ich manchmal noch die AzureAD Powershell, welches aber abgekündigt ist. (Siehe EOL MSOnline und AzureAD PowerShell). Die Befehle für die die Microsoft Graph PowerShell (Siehe MGGraph PowerShell) sind sehr ähnlich.
Die Kontakt konnte ich dann per Exchange Online Powershell als auch AzureAD PowerShell sehen:
Entra ID | Exchange Online PowerShell |
---|---|
PS C:\> Get-AzureADContact -Filter "displayname eq 'Cloudcontact1'" | fl DeletionTimestamp : ObjectId : 832c1b00-267c-49e9-b53c-9c4ce83bf8c0 ObjectType : Contact City : CompanyName : Country : Department : DirSyncEnabled : DisplayName : Cloudcontact1 FacsimileTelephoneNumber : GivenName : Cloudcontact1 JobTitle : LastDirSyncTime : Mail : Cloudcontact1@uclabor.de MailNickName : Cloudcontact1 Mobile : PhysicalDeliveryOfficeName : PostalCode : ProvisioningErrors : {} ProxyAddresses : {SMTP:Cloudcontact1@uclabor.de} SipProxyAddress : State : StreetAddress : Surname : Cloudcontact1 TelephoneNumber : |
PS C:\> Get-MailContact cloudcontact1| fl ExternalEmailAddress : SMTP:Cloudcontact1@uclabor.de MaxRecipientPerMessage : Unlimited UseMapiRichTextFormat : Never UsePreferMessageFormat : False MessageFormat : Mime MessageBodyFormat : TextAndHtml MacAttachmentFormat : BinHex UserCertificate : {} UserSMimeCertificate : {} HasPicture : False HasSpokenName : False IsDirSynced : False AcceptMessagesOnlyFrom : {} AcceptMessagesOnlyFromDLMembers : {} AcceptMessagesOnlyFromSendersOrMembers : {} AddressListMembership : {\All Contacts(VLV), \All Recipients(VLV), \Default Global Address List, \AllContacts...} AdministrativeUnits : {} Alias : Cloudcontact1 ArbitrationMailbox : BypassModerationFromSendersOrMembers : {} CustomAttribute1 ..15 : ExtensionCustomAttribute1..5 : {} DisplayName : Cloudcontact1 EmailAddresses : {SMTP:Cloudcontact1@uclabor.de} GrantSendOnBehalfTo : {} ExternalDirectoryObjectId : 832c1b00-267c-49e9-b53c-9c4ce83bf8c0 HiddenFromAddressListsEnabled : False LastExchangeChangedTime : MaxSendSize : Unlimited MaxReceiveSize : Unlimited ModeratedBy : {} ModerationEnabled : False PoliciesIncluded : {} PoliciesExcluded : {{26491cfc-9e50-4857-861b-0cb8df22b5d7}} EmailAddressPolicyEnabled : False PrimarySmtpAddress : Cloudcontact1@uclabor.de RecipientType : MailContact RecipientTypeDetails : MailContact RejectMessagesFrom : {} RejectMessagesFromDLMembers : {} RejectMessagesFromSendersOrMembers : {} RequireSenderAuthenticationEnabled : False SimpleDisplayName : SendModerationNotifications : Always UMDtmfMap : {} WindowsEmailAddress : Cloudcontact1@uclabor.de MailTip : MailTipTranslations : {} Identity : Cloudcontact1 Id : Cloudcontact1 IsValid : True ExchangeVersion : 0.20 (15.0.0.0) Name : Cloudcontact1 ObjectClass : {top, person, organizationalPerson, contact} OrganizationalUnitRoot : msxfaqdev.onmicrosoft.com |
Den Kontakt könnten sie genau mit Get-EXOObject, Get-MGContact u.a. Befehle abfragen. Bedenken Sie aber, dass einige Tools das Entra ID abfragen und andere das Exchange Online Directory. Das sind unterschiedliche Verzeichnisdienste, die aber von Microsoft repliziert werden. Siehe dazu auch Azure AD - Ein Verzeichnisdienst, oder zwei oder mehr. Es gibt zwar einen Kontakt im EntraID aber im Azure-Portal finde ich das Objekte dennoch nicht:
Das mag vielleicht daran liegen, dass Kontakte im Gegensatz zur Benutzern, Gästen und Gruppen keine richtig aktiven Identitäten sind, die sich anmelden könnten oder Berechtigungen ausüben. Dennoch hätte ich mir gewünscht, dass auch das Azure-Portal die Kontakte zumindest anzeigt. Neben dem Exchange Online Admin Center könne sie aber auch im eigentlichen Microsoft 365 Admin Portal ebenfalls Kontakte einsehen und ändern.
Die UI unterscheidet sich aber etwas vom Exchange Admin Center. So gibt es hier keinen Mailuser". Über Microsoft Graph können Sie auch Kontakte anlegen, ändern, löschen. Bei "New-MgContact" können Sie auch Felder wie "Mailnickname" und "ProxyAddresses" setzen, was sich auf Exchange auswirkt. Allerdings habe ich keinen Parameter gefunden, um z.B. die Sichtbarkeit im Adressbuch zu steuern.
Hinweis: Bei der Arbeit mit Graph und Kontakten verweisen viele Seite auf die "persönlichen Kontakte" im Exchange Postfach. Um die geht es auf dieser Seite nicht! Es gibt einen Unterschied zwischen "*-MGContact" und "*-MGUserContact". hier geht es um die "OrgContacts".
- MGGraph PowerShell
- EOL MSOnline und AzureAD PowerShell
- Get orgContact
https://learn.microsoft.com/en-us/graph/api/orgcontact-get?view=graph-rest-1.0&tabs=http
List orgContacts https://learn.microsoft.com/en-us/graph/api/orgcontact-list?view=graph-rest-1.0&tabs=http - Get-MGContact
https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.directorymanagement/get-mgcontact - Update-MGContact
https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.directorymanagement/update-mgcontact - New-MGContact
https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.directorymanagement/new-mgcontact - Remove-MGContact
https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.directorymanagement/update-mgcontact
Wir haben nun einen Kontakt im Exchange Online Adressbuch mit einer Mailadresse. Es ist aber keine Identität, die für eine Anmeldung genutzt werden kann.
Produkt | Beschreibung |
---|---|
Exchange Online |
Anwender können den Kontakt in Outlook auflösen und Mails an den Kontakt versenden. Administratoren können den Kontakt in CloudOnly-Verteiler aufnehmen. Sollten die Verteiler aus einem lokalen AD mit ADSync repliziert werden, dann sollte Sie auch die Kontakte im lokalen AD als "MailContacts" mit den lokalen Exchange Management Tools anlegen, in die Verteiler aufnehmen und durch ADSync replizieren lassen. |
Microsoft Teams |
Ein Kontakt ist in Microsoft Teams nicht sichtbar. Sie können ihn daher nicht als Mitglied in ein Team aufnehmen.
Auch die Suche nach Federation-Partnern listet den Exchange
Kontakt nicht auf: |
Kontakte sind eigentlich "Exchange Kontakte" und auch wenn es in Entra-ID natürlich ein Gegenstück gibt, wird der Kontakt weitgehend ignoriert.
- How to: Create Mail-Enabled Contacts
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/forefront-2010/ms696036(v=vs.100)
Test 2: Gastkonto
Nun spinnen wir die Geschichte etwas weiter. Der Tenant mit den Kontakten der befreundeten Firma möchte die anderen Benutzer gerne als Gast bei sich in Teams nutzen. Lange Zeit konnte der Teams-Besitzer direkt einen Gast in Teams addieren und damit eine Einladung aussprechen. Im Hintergrund wird dann ein Gastkonto angelegt. Größere Firmen haben hier Prozesse etabliert, um Gäste einzuladen. In meinem Test-Tenant bin ich zugleich Administrator und konnte in ein Team einen neuen Benutzer aus einem anderen Tenant addieren:
Sie sehen aber auch, dass der vorhandene Exchange Kontakt und AzureAD Kontakt nicht angeboten wird. Im Hintergrund wurde nun ein AzureAD-Gastkonto angelegt. Eine Suche mit der AzureAD-PowerShell liefert nun.
PS C:\> Get-AzureADContact -Filter "mail eq 'Cloudcontact1@uclabor.de'" | fl ObjectID,Displayname,Mail,Proxy*,UserType ObjectId : 832c1b00-267c-49e9-b53c-9c4ce83bf8c0 DisplayName : Cloudcontact1 Mail : Cloudcontact1@uclabor.de ProxyAddresses : {SMTP:Cloudcontact1@uclabor.de} PS C:\> Get-AzureADUser -Filter "mail eq 'Cloudcontact1@uclabor.de'" | fl ObjectID,Displayname,Mail,Proxy*,UserType ObjectId : aaa15964-57df-4608-afc9-7a22c9934fbd DisplayName : Cloudcontact1 Mail : Cloudcontact1@uclabor.de ProxyAddresses : {} UserType : Guest
Wir haben nun zwei unterschiedliche Objekte, die sogar die gleiche Mailadresse haben. Wenn ich danach in Teams wieder nach dem Benutzer zum Chatten gesucht habe, dann wurde nun der Gast angezeigt. Ich konnte aber auch weiter nach externen Empfängern mit der Adresse suchen. Eine Federation wird durch das Gastkonto nicht verhindert.
Aber natürlich müssen Sie ihre Anwender schulen, damit sie wissen, wohin die Nachrichten gehen. Wer hier den Gast auswählt, sendet die Nachricht nicht über Federation an den Heimattenant des Gasts sondern an das Gastkonto. Der Gast muss zum Lesen dann zu ihrem Tenant wechseln.
Natürlich wurde mir der Gast auch angeboten, wenn ich Mitglieder in einem bestehenden Microsoft Teams addieren wollte. Allerdings ist der Gast "versteckt", da das Attribut "HiddenFromAdressListsEnabled = $true" ist.
PS C:\> Get-Recipient Cloudcontact1@uclabor.de ` >> | fl displayname,RecipientType,RecipientTypeDetails,externalemailaddress,` >> primarysmtpaddress,emailaddresses,HiddenFromAddressListsEnabled DisplayName : Cloudcontact1 RecipientType : MailContact RecipientTypeDetails : MailContact ExternalEmailAddress : SMTP:Cloudcontact1@uclabor.de PrimarySmtpAddress : Cloudcontact1@uclabor.de EmailAddresses : {SMTP:Cloudcontact1@uclabor.de} HiddenFromAddressListsEnabled : False DisplayName : Cloudcontact1 RecipientType : MailUser RecipientTypeDetails : GuestMailUser ExternalEmailAddress : SMTP:Cloudcontact1@uclabor.de PrimarySmtpAddress : EmailAddresses : {} HiddenFromAddressListsEnabled : False
Der Gastbenutzer ist aber auch im Adressbuch versteckt und hat keine ProxyAdressen (EmailAddreses). Es ist im Grunde aber ein MailUser ist, habe ich einfach mal versucht, dieses Objekt "sichtbar" zu machen:
PS C:>Set-MailUser Cloudcontact1@uclabor.de -HiddenFromAddressListsEnabled:$false PS C:\> Get-Recipient Cloudcontact1*@uclabor.de ` | ft displayname,RecipientTypeDetails,HiddenFromAddressListsEnabled DisplayName RecipientTypeDetails HiddenFromAddressListsEnabled ----------- -------------------- ----------------------------- Cloudcontact1 MailContact False Cloudcontact1 GuestMailUser False
Auf die Idee sind ja schon weitere Personen gekommen:
- Mail-enabling Guest Users or “How I made everyone show up in the Address
Book”
https://www.undocumented-features.com/2018/06/15/mail-enabling-guest-users-or-how-i-made-everyone-show-up-in-the-address-book/
Achtung: Es kann angeblich bis zu 24h dauern, bis Exchange Online diese Änderungen dann auch bis zu den Clients gebracht hat.
Prüfen, ob das nach einiger Zeit immer noch so ist. Angeblich dauert es bis zu 24h
Damit ich im Exchange Adressbuch die beiden Objekte besser unterscheiden kann, habe ich den Displaynamen des Gastusers etwas angepasst.
Set-MailUser ` -Identity Cloudcontact1@uclabor.de ` -HiddenFromAddressListsEnabled:$false ` -DisplayName Cloudcontact1g
Natürlich wollte ich auch in Outlook bzw. Outlook Web Access das Ergebnis sehen, wie die Benutzer dies nun sehen:
Leider kann ich da nur den MailContact finden aber nicht den Gastbenutzer. Ich habe schon absichtlich in der "Default Global Address List" gesucht, da es ja kein Kontakt, sondern ein User ist. Nach etwas Suche habe ich eine zuverlässige Quelle gefunden.
These users were not appearing in the global address list. This is by design.
The Exchange Online provisioning process only adds users to the global address
list if the guest account type is member.
Quelle: Office 365: Guest accounts do not appear in the global address list.
https://timmcmic.wordpress.com/2021/08/16/office-365-guest-accounts-do-not-appear-in-the-global-address-list/
Damit macht es auch Sinn, wenn Cross-Tenant Sync im Ziel als Standard die Gäste als "Member" anlegt.
Auch wenn ich Gäste mit einer Mailadresse im Exchange Admin Center als Empfänger sehe, sind Sie denn noch nicht im Outlook Client zu finden.
Test 3: Externer Member
Wenn externe Identitäten vom Typ "Gast" nicht im Exchange Adressbuch auftauchen, obwohl Sie mit "-HiddenFromAddressListsEnabled:$false" nachträglich entsprechend gekennzeichnet wurden aber externe Konten von Typ" Member" auftauchen sollen, dann muss das getestet werden. Um mein CloudContact1 nicht zu stören, habe ich einen neuen Kontakt "CloudContact2" angelegt.
PS C:> New-MailContact ` -Name Cloudcontact2@uclabor.de ` -ExternalEmailAddress Cloudcontact2@uclabor.de
Da Microsoft Teams beim Addieren neuer Gäste den Typ nicht vorgeben kann, habe ich über das Azure Portal den externen Member angelegt.
Per PowerShell geht dies natürlich auch mittels Graph.
- New-MgInvitation
https://learn.microsoft.com/en-us/powershell/module/microsoft.graph.identity.signins/new-mginvitation - Quickstart: Add a guest user with PowerShell
https://learn.microsoft.com/en-us/entra/external-id/b2b-quickstart-invite-powershell
Bei einer Suche in Teams zeigt mir Teams den "Member"-Gast. Zudem erlaubt mit Teams immer noch nach extern zu suchen, so denn der Endanwender den Unterschied kennt
Das ist wichtig hier die Anwender zu schulen, den richtigen Kommunikationspartner zu nutzen.
Wenn sie Identitäten in ein Team hinzufügen wollen, dann stehen beide Typen der externen Identitäten , d.h. "Guest" und "Member" zur Auswahl.
In Exchange sieht das Bild wieder anders aus. In der Exchange PowerShell finde ich mit "Get-Recipient" mittlerweile mehrere Empfänger, die ich auch alle "HiddenFromAddressListsEnabled = $False" gesetzt habe.
Hier erscheinen aber nur echte Exchange Kontakte und "externe Identitäten (Guest)" aber keine "externe Identitäten (Member)" Im AzureAD-Portal sind die beiden "externen Identitäten" sichtbar aber keine Exchange Kontakte , die in EntraID auch Kontakte sind und im Portal nicht unter "Users" angezeigt werden.
In Outlook Web Access sehe ich aber folgende Empfänger:
Das ist nun schon etwas überraschend, den in der Exchange PowerShell sehe ich doch 5 Empfänger. Zur Sicherheit habe ich noch einmal die Mitgliedschaft in den Adresslisten ausgeben lassen:
Für die Sichtbarkeit in Exchange, Outlook, OWA und anderen Exchange Funktionen gibt es hier anscheinend noch einen versteckten Filter, der bestimmte Objekte ausblendet.
Auch in Teams sind nicht alle Objekt sichtbar aber zumindest ist die Auswahlliste bei Federation und Mitgliedschaft in Teams identisch
Achtung: Denken Sie bei solchen Aktionen und Tests immer an die Verzögerungen durch Replikationen zwischen lokalen AD, AzureAD, Exchange Online AD, Teams Directory und dann kommen noch Cache-Funktionen dazu. Ein gelöschter Kontakt kann durchaus einmal mehrere Stunden als "Leiche" noch sichtbar sind. Meist bekommen Sie dann aber einen Fehler, wenn Sie das Objekte verwenden wollen, z.B.
Auch der umgekehrte Fall ist natürlich möglich, d.h. sie legen ein neues Objekt an und es erscheint erst deutlich verzögert.
Exchange GAL, Teams Gast und Federation
Dann stellen wir mal die verschiedenen Objekte und ihre Sichtbarkeit dar. Für die Powershell geht es recht einfach:
Nicht jeder User ist auch ein Recipient (z.B. CloudUser2 ohne Lizenz) aber auch nicht jeder Recipient ist auch ein User (z.B. Cloudcontact1)
Name | EntraID | Exchange Admin (Get-User) |
Exchange Admin (Get-Recipient) |
Outlook | Teams Personensuche | Teams Mitglied |
---|---|---|---|---|---|---|
Cloudcontact1 |
Contact (nicht sichtbar) | Nicht vorhanden | MailContact | Kontakt | Nicht vorhanden | Nicht vorhanden |
Cloudcontact1g |
External Guest | GuestMailuser | GuestMailuser | Nicht sichtbar | Vorhanden | Teammitglied |
Cloudcontact2 |
Contact (nicht sichtbar) | Nicht vorhanden | MailContact | Kontakt | Nicht vorhanden | Nicht vorhanden |
Cloudcontact2m |
External Member | User | Nicht vorhanden | Nicht sichtbar | Vorhanden | Teammitglied |
Cloudcontact3 |
Contact (nicht sichtbar) | Nicht vorhanden | MailContact | Kontakt | Nicht vorhanden | Nicht vorhanden |
Cloudcontact4m |
External Member | User | Nicht vorhanden | Nicht vorhanden | Vorhanden | Teammitglied |
Die Tabelle erscheint mir selbst noch nicht ganz schlüssig. Vor allem, dass ExternalMember unterschiedlich zu ExternalGuest behandelt werden und ExternalGuest zwar im Exchange Management erscheinen aber nicht im Adressbuch bei den Clients, obwohl er nicht versteckt (HiddenFromAddressListsEnabled : False) ist
Vielleicht habe ich aber nur eine kleine Einstellung übersehen, damit "External Member" oder ""External Guest" auch in der Exchange GAL sichtbar werden. "External Guest" sind ja schon mal als Objekte vorhanden.
Sonderfall "ShowInAdressList"
Bei der Recherche bin ich schon weiter oben auf das Exchange Property "HiddenFromAddressList" gestoßen und konnte es mit Set-MailContact auch unabhängig vom AzureAD setzen. Es gibt aber auch im AzureAD ein Property "ShowInAddressList", welches ich lesen und setzen kann. Zuerst habe ich den aktuellen Status der AzureAD-User und AzureAD-Contacts über die neue Microsoft Graph Powershell ausgelesen. Die alte "AzureAD-Powershell" ist schon länger abgekündigt (EOL MSOnline und AzureAD PowerShell)
Die "-Filter"-Funktion der AzureAD oder
MSGraph-PowerShell ist leider komplett abweichend von dem,
was ein Exchange Admin so kennt. Oft geht nur "eq, and, or"
aber kein Like. Ich habe daher alle Objekte abgerufen und
dann nachträglich mit "where" gefiltert.
Zudem rufen die Graph Commandlets nicht alle Werte ab und
lassen die Felder dann aber leer. Ich muss die
erforderlichen Properties explizit angeben.
- Advanced query capabilities on Microsoft Entra ID objects
https://learn.microsoft.com/en-us/graph/aad-advanced-queries?tabs=powershell#contract-properties
Get-MgUser -all -property Displayname,ShowInAddressList ` | Where {$_.DisplayName -like 'cloudcontact*'} ` | ft displayname,showinaddresslist Get-Mgcontact -property Displayname,ShowInAddressList ` | Where {$_.DisplayName -like 'cloudcontact*'} ` | ft displayname,showinaddresslist
Es ist gut zu sehen, dass die Entra ID User diese Property haben und es aus "False" steht. Das könnte ein Grund sein, dass diese Objekte nicht in Exchange Online als Empfänger in der GAL erscheinen. Bei den Entra ID-Kontakten hingegen, welche ich über die Exchange Online PowerShell angelegt habe, ist das Feld "$null". Um die Zusammenhänge weiter zu verstehen, haben ich mir vier weitere Benutzer angelegt
Displayname Typ Mailadresse Beschreibung ========================================================================================================= cloudcontact8m External Member CloudContact8m@uclabor.de (So würde Cross-Tenant Sync den User anlegen) cloudcontact8g Externel Guest CloudContact8g@uclabor.de (So sind in Teams eingeladene Benutzer cloudcontact8u Internal Member CloudContact8u@uclabor.de (interner User als Member, d.h. reguläre Anwender) cloudcontact8i Internal Guest CloudContact8i@uclabor.de (interner User als Gast, möglich habe habe ich noch nie genutzt.)
Interessant sind natürlich nur die externen Benutzer, denn das interne User-Konto kann ich ganz einfach zu MailUser oder MailboxUser machen während ich noch keinen Anwendungsfall für "internal Guest" gesehen habe. Per Get-MGUser sehe ich aber, dass nur die externen Objekte auch ein Attribut bekommen haben.
In der Exchange PowerShell sind diese Objekte auch nach einiger Zeit noch nicht als "Recipients" aufgetaucht aber sehr wohl als User.
Sowohl den "External User" als auch den "Internal User" könnte ich mit einer Exchange Lizenz zu einen MailboxUser machen und mit "Enable-MaiUser" auch zum Kontakt hochstufen. Mir geht es aber um die Funktion der Kontakte und daher habe die beiden User nun im AzureAD umgesetzt.
Leider konnte ich dies, warum auch immer, nicht mit "Update-MGUser" umsetzen. Graph hat mit einem "403 Authorization_RequestDenied" dies abgelehnt, obwohl ich "User.ReadWrite" hatte. Per AzureAD-Powershell war es aber möglich.
PS C:\> Get-AzureADuser -Filter "DisplayName eq 'cloudcontact8g'" | Set-AzureADUser -ShowInAddressList $true PS C:\> Get-AzureADuser -Filter "DisplayName eq 'cloudcontact8i'" | Set-AzureADUser -ShowInAddressList $true PS C:\> Get-AzureADuser -Filter "DisplayName eq 'cloudcontact8m'" | Set-AzureADUser -ShowInAddressList $true PS C:\> Get-AzureADuser -Filter "DisplayName eq 'cloudcontact8u'" | Set-AzureADUser -ShowInAddressList $true
Die Kontrolle per Get-MGGraphUser liefert dann die Bestätigung: Alle Objekte sind nun im AzureAD als "ShowInAddressList = $True" gesetzt.
Nun warten wir einige Zeit ab, bis die Replikation erfolgt ist. Um dies besser zu sehen, habe ich danach den Displaynamen der vier Objekte erweitert um direkt in Exchange, Teams u.a. zu sehen, ob die Änderungen schon angekommen sind. Auch das hat MGGraph angeblich mangels Berechtigungen abgelehnt aber noch funktionierte ja die AzureAD-PowerShell.
Get-AzureADuser -all $true ` | where {$_.DisplayName -like 'cloudcontact8*'} ` | %{set-azureaduser -ObjectId $_.objectid -DisplayName "$($_.displayname)-2"}
Es hat nur ein paar Sekunden gedauert, bis ich die User auch in der Exchange PowerShell gesehen habe:
Get-user cloudcontact8* | ft displayname,recipienttypedetails DisplayName RecipientTypeDetails ----------- -------------------- cloudContact8m-2 User CloudContact8u-2 User
Ich habe das so erwartet, dass die "Internal-Member" (= reguläre User) und "External-Member" auch in Exchange Online als User aber ohne Mailfunktion erscheinen. Ich habe aber nicht erwartet, dass meine neu angelegten Gäste überhaupt nicht in Exchange sichtbar geworden sind. Ich habe dann als Gegenprobe noch einmal in Teams einen weiteren Gast eingeladen:
Unter den Mitgliedern in Teams habe ich auch den neuen CloudUser9 als Mitglied gesehen aber weder in Exchange Online noch EntraID ist der Gast erschienen.
Es ist wohl Zeit für eine Pause. Anscheinend werden auch Gasteinladungen in Teams nicht sofort in ein Entra ID-Objekt umgesetzt oder das Entra ID hatte zu dem Zeitpunkt eine Störung, so dass die Replikation verzögert war. Ich habe dann erst einmal eine "Pause" eingelegt, damit Microsoft 365 all die Änderungen umsetzen kann. Einige Stunden später war dann auch mein "CloudUser9" in EntraID und Exchange Admin Center sichtbar aber nicht im Exchange Adressbuch
- Anzeige in Outlook
- Anzeige in Teams Personensuche
- Show Guest User in GAL. Exchange Online settings.
https://learn.microsoft.com/en-us/answers/questions/1141925/show-guest-user-in-gal-exchange-online-settings - Hide all Azure AD Guest users from Exchange GAL - is it possible and where
is the catch?
https://www.reddit.com/r/Office365/comments/1cn4df9/hide_all_azure_ad_guest_users_from_exchange_gal/
Bewertung
Wenn das aber so stimmt und nicht verändert wird, dann hat das durchaus Auswirkungen auf die engere Zusammenarbeit von zwei Tenants samt Verzeichnisabgleich mit Cross-Tenant Sync. Wenn ich mit Cross-Tenant Sync im anderen Tenant "External Member" anlegen lasse, was der Default ist, dann funktioniert das sehr gut mit Teams aber hilft mit in Exchange nicht weiter. Wenn ich Cross-Tenant Sync aber anweise, stattdessen Objekte vom Typ "External Guest" anzulegen dann können Sie in Teams genutzt werden, erscheinen auch im Exchange Management als "GuestMailUser" aber dennoch nicht im Exchange Adressbuch.
Egal ob sie aber nun durch Cross-Tenant Sync im anderen Tenant "External Guest" oder "External Member" anlegen lassen, so vereinfacht dies zwar die Zusammenarbeit in Teams und Kanälen, aber die Anwender müssen bei 1:1 Chat über Federation aufpassen, dass sie das gewünschte Konto erwischen. Wer den von Teams vorgeschlagenen Kontakt nutzt, zwingt den Partner einen Tenant-Wechsel vorzunehmen. Nur wer auf "Extern nach ... suchen" klickt, kann den Partner in dessen Heimattenant finden und dann über Federation chatten.
Wie Sie aber an den Paarungen "CloudContact1/CloudContact1g" und "CloudContact2/CloudContact2m" gut sehen können, kann ich durchaus Objekte mit der gleichen Mailadresse versehen. Wenn ich eine Person aus einem anderen Tenant in meinem Tenant sowohl im Exchange Adressbuch als auch in Teams als verwaltetes Objekt haben möchte, dann muss ich zwei Objekte verwalten. Das wird aber dann knifflig, wen Sie ADSync einsetzen, denn lokale Exchange-Objekte mit einer Mailadresse können nicht expliziert werden, wenn ein Gastkonto die Adresse blockiert.
- Resolving conflicts between Guest
accounts and mail users in Azure AD
https://cloudrun.co.uk/azure-ad/resolving-conflicts-between-guest-accounts-and-mail-users-in-azure-ad/
Weitere Links
- Microsoft 365 Identity Management
- Office 365 Gast-Konten / Azure B2B
- ADSync / AADConnect
- Cross-Tenant Sync
- ADSync Multi Forest
- ADSync Funktionsweise
- Azure AD - Ein Verzeichnisdienst, oder zwei oder mehr
- DL Management mit EXO
- Exchange Online Provisioning
- MGGraph PowerShell
- EOL MSOnline und AzureAD PowerShell
- AzureAD Identitäten
- Einführung in Microsoft Entra External ID
https://learn.microsoft.com/de-de/entra/external-id/external-identities-overview - Find Azure AD PowerShell and MSOnline cmdlets in Microsoft Graph PowerShell
https://learn.microsoft.com/en-us/powershell/microsoftgraph/azuread-msoline-cmdlet-map?#contacts - Manage guest access in Microsoft 365 groups
https://learn.microsoft.com/en-us/microsoft-365/admin/create-groups/manage-guest-access-in-groups?view=o365-worldwide#add-guests-to-the-global-address-list - Office 365: Guest accounts do not appear in the global address list.
https://timmcmic.wordpress.com/2021/08/16/office-365-guest-accounts-do-not-appear-in-the-global-address-list/ - Office 365: Directory synced mail users, guest accounts, and validation errors…
https://timmcmic.wordpress.com/2023/02/21/office-365-directory-synced-mail-users-guest-accounts-and-validation-errors/ - Office 365: Office 365 Groups and External / Guest Accounts
https://timmcmic.wordpress.com/2018/02/06/office-365-office-365-groups-and-external-guest-accounts/ - Get-AzureADUser -Filter Example
https://www.easy365manager.com/get-azureaduser-filter-example/ - Migrating Exchange Online Mail Contacts to Entra ID Guest Accounts
https://practical365.com/migrate-mail-contact-azure-ad-guest-accounts/ - Comparing Azure AD Guest Accounts and Exchange Online Mail Contacts
https://office365itpros.com/2023/03/02/mail-contacts-vs-guest-accounts/ - Resolving conflicts between Guest accounts and mail users in Azure AD
https://cloudrun.co.uk/azure-ad/resolving-conflicts-between-guest-accounts-and-mail-users-in-azure-ad/ - Azure AD guest users are not visible in the Global Address List (GAL)
https://answers.microsoft.com/en-us/msoffice/forum/all/azure-ad-guest-users-are-not-visible-in-the-global/74800113-ff32-4585-8bc2-f670dd8f52ee - How can we display guest users in GAL with their email address instead of
their UPN?
https://learn.microsoft.com/en-us/answers/questions/1215094/how-can-we-display-guest-users-in-gal-with-their-e - Mail-enabling Guest Users or “How I made everyone show up in the Address
Book”
https://www.undocumented-features.com/2018/06/15/mail-enabling-guest-users-or-how-i-made-everyone-show-up-in-the-address-book/ - Show Guest User in GAL. Exchange Online settings.
https://learn.microsoft.com/en-us/answers/questions/1141925/show-guest-user-in-gal-exchange-online-settings - Hide all Azure AD Guest users from Exchange GAL - is it possible and where
is the catch?
https://www.reddit.com/r/Office365/comments/1cn4df9/hide_all_azure_ad_guest_users_from_exchange_gal/