ADSync mit Exchange Online Only

Diese Seite beschreibt einen Weg eine Umgebung mit Exchange Online und aktiviertem Verzeichnisabgleich ohne lokalen Exchange Server zu verwalten. Laut Microsoft geht dies offiziell nur mit einem lokalen Exchange Server und einem Hybrid Setup. Hier zeige ich einen Weg, wie sie ohne lokalen Exchange Server die Cloud verwalten können.

Seit Exchange 2019 CU12 vom 20. Apr 2022 gibt es nun eine Lösung mit der Exchange Management Rolle
Manage recipients in Exchange Hybrid environments using Management tools
https://learn.microsoft.com/en-us/Exchange/manage-hybrid-exchange-recipients-with-management-tools

THR2145 - Why do we need to keep an Exchange Server On-Premises when we move to the cloud
https://myignite.techcommunity.microsoft.com/sessions/66438

Sie können natürlich auf die Vorteile von ADSync verzichten und die Objekte durch eigene Werkzeuge zwischen einem lokalen AD und dem Tenant provisionieren.

Die Problemstellung

Was auf den ersten Blick einfach erscheint, ist doch kniffliger als oft gedacht. Sobald eine Firma etwas größer ist, wird Sie mit dem Office 365 Verzeichnisabgleich (Office 365:Identity) die Verwaltung der Anwender in Office 365 an das lokale Active Directory ankoppeln. Durch die Aktivierung des DirSync wird es aber unmöglich (Stand Ende 2016) die Exchange Eigenschaften der Benutzer in der Cloud zu verwalten. Office 365 geht durch den Verzeichnisabgleich davon aus, dass alle Exchange Eigenschaften immer im lokalen Active Directory verwaltet und diese durch den Abgleich dann auch in die Cloud repliziert werden.

Das ist in Verbindung mit dem Exchange Hybrid Mode auch kein Problem. Hier gibt es schließlich mindestens einen lokal installierten Exchange Server, der als Brückenkopf die lokalen Services mit Office 365 verbindet. Aber was meine Firma, die gar keinen lokalen Exchange Server mehr haben will? Bislang gab es hier nur die Wahl die entsprechenden Werte per ADSIEDIT oder Skript direkt im lokalen Active Directory zu schreiben. Das hat sogar funktioniert. Allerdings musste man dazu die komplette Logik von Exchange noch einmal nachentwickeln. Das ist nicht nur aufwändig und fehleranfällig. Es birgt vor allem das Risiko bei zukünftigen Erweiterungen immer wieder selbst ermitteln zu müssen, was nun richtig ist. Ich habe also nach einem Weg gesucht, mit den offiziellen PowerShell Commandlets zu arbeiten ohne einen vollen Exchange Server installieren zu müssen. Microsoft schreibt dazu:

When directory synchronization is enabled for a tenant and a User is synchronized from On-Premises, most of the attributes cannot be managed from Exchange Online and must be managed from On-Premises. This is not due to the hybrid configuration, but it occurs because of directory synchronization. In addition, even if you have directory synchronization in place without running the Hybrid Configuration Wizard, you still cannot manage most of the recipient tasks from the cloud.
Quelle: https://technet.microsoft.com/en-us/library/dn931280(v=exchg.150).aspx

Step5: After you’ve verified that all e-mail is being routed directly to the cloud-based mailboxes, completed the migration, and no longer need to maintain your On-Premises e-mail organization für mail delivery you can uninstall Exchange from servers in your On-Premises Exchange organization. However, it’s strongly recommended that you maintain at least one Exchange server so that you have access to Exchange System Manager (Exchange 2003) or Exchange Management Console/Exchange Management Shell (Exchange 2007 and Exchange 2010) to manage mail-related attributes on the On-Premises MEUs. für Exchange 2007 and Exchange 2010, the Exchange server that you maintain should have the Hub Transport, Client Access, and Mailbox server roles installed.
Quelle: https://community.office365.com/en-us/w/exchange/835

Generally speaking, when DirSync is enabled, an On-Prem Exchange server is recommended for official supported and management tools.
If you choose to disable DirSync, you can manage the Office 365 User’s Exchange-related attributes in Office 365 directly.
Quelle: How to Manager Exchange Attributes with DirSync Enabled (http://community.office365.com/en-us/f/148/t/227778.aspx)

The question of whether a third-party management tool or ADSIEDIT can be used is often asked. The answer is you can use them, but they are not supported. The Exchange Management Console, the Exchange Administration Center (EAC), and the Exchange Management Shell are the only supported tools that are available to manage Exchange recipients and objects
https://technet.microsoft.com/en-us/library/dn931280(v=exchg.150).aspx

Ich nehme mit, dass Microsoft einen letzten lokalen Exchange z.B. als "SMTP-Relayserver" und zur Verwaltung empfiehlt aber auch die Verwaltung mit der Exchange Management Shell erlaubt ist. Eine direkte Verwaltung per ADSI und anderen Tools ist nicht supported aber gegen eine (lokale) Exchange Powershell sollte nichts sprechen. Stellt sich nur die Frage, wie eine solche Umgebung in einem jungfräulichen Active Directory zu installieren ist.

Management Tools installieren

Diesen Abschnitt habe ich schon im Jahr 2016 geschrieben. Erst mit dem Exchange 2019 CU12 ist dieser Weg aber offiziell supportet. Siehe dazu Exchange Management Rolle

Der Regelfall zur Administration von Exchange ist entweder die PowerShell oder früher die Exchange MMC und seit Exchange 2016 die Webverwaltung. All diese Wege nutzen aber die "Remote Exchange PowerShell" um sich mit einem Exchange Server zu verbinden der dann gemäß den RBAC-Rollen die Anweisungen des Administrators als "Exchange Server" umsetzen. So muss nicht mal der Administrator direkt auf den AD-Objekten berechtigt werden.

Ohne Exchange Server gibt es aber auch keine Exchange PowerShell. Allerdings gibt es auch noch zwei PowerShell-Umgebungen, die der normale Administrator normalerweise nicht nutzt. Die erste wird nur vom Exchange Setup selbst zur Einrichtung von Exchange verwendet. Die zweite Umgebung wird durch die Installation der Management Tools bereit gestellt.

Ich habe dazu in einem Windows 2012R2 Forest, in dem es noch nie einen Exchange Server gab, das Setup nur für die Management Tools ausgeführt. Natürlich muss ich auch hier Enterprise Admin etc. sein, denn auch hier ist die Erweiterung des Schemas um neue Exchange Properties und die Anlage einiger Systemobjekte, Gruppen und Container erforderlich. Bei der eigentlichen Installation habe ich dann weder die Edge-Rolle noch die Mailbox Rolle installiert.

Dennoch braucht allein das Basissystem schon 3,5 GB auf dem Server. Ich denke es wird hier deutlich mehr als nur die Management Tools installiert.

Laut Microsoft sind für die Installation der Management Tools sonst keine Komponenten erforderlich. Das stimmt so aber nicht. Meine Installation hat im Hintergrund folgende Rollen nachinstalliert:

Add-WindowsFeature `
   Web-Mgmt-Console, Web-Metabase, Web-Lgcy-Mgmt-Console, `
   NET-Framework-45-Features, RSAT-ADDS-Tools, `
   Server-Gui-Mgmt-Infra, Windows-Identity-Foundation"

Nach der Installation der Management Tools ist ein Neustart des Servers erforderlich.

Im Startmenü verankern sich folgende drei Einträge zu Exchange, von denen die Toolbox zumindest bei mir nicht startet und die Management-Shell mit einem Fehler abbricht und nach dem FQDN eines Exchange Servers fragt.

Solange es keinen Exchange Server gibt, ist das auch durchaus zu erwarten gewesen. Der Eintrag zu "Exchange Server Help" startet bei mir immer noch einen Browser auf die Exchange 2013 Hilfen (https://technet.microsoft.com/en-us/library/bb124558(EXCHG.150).aspx).

Es sind einfach ein paar DLLs und Module und am Ende auch weniger als die angekündigten 3,3 GB

Im IIS sind keine neuen virtuellen Verzeichnisse dazu gekommen.

Es wurde auch sonst kein weiterer Dienst installiert. Interessant ist aber, dass das Setup durchaus eine komplett Exchange Organisation im Active Directory anlegt.

Sogar die E-Mail Address Policies wurden mit angelegt wie folgender Auszug zeigt:

PS C:\> Get-EmailAddressPolicy | fl

RecipientFilter                   : Alias -ne $null
LdapRecipientFilter               : (mailNickname=*)
RecipientFilterApplied            : True
IncludedRecipients                : AllRecipients
ConditionalDepartment             : {}
ConditionalCompany                : {}
ConditionalStateOrProvince        : {}
ConditionalCustomAttribute1       : {}
...ConditionalCustomAttribute15      : {}
RecipientContainer                :
RecipientFilterType               : Precanned
Priority                          : Lowest
EnabledPrimarySMTPAddressTemplate : @uclabor.de
EnabledEmailAddressTemplates      : {SMTP:@uclabor.de}
DisabledEmailAddressTemplates     : {}
HasEmailAddressSetting            : True
HasMailboxManagerSetting          : False
NonAuthoritativeDomains           : {}
ExchangeVersion                   : 0.1 (8.0.535.0)
Name                              : Default Policy
DistinguishedName                 : CN=Default Policy,CN=Recipient
                                    Policies,CN=UCLABOR,CN=Microsoft Exchange,C
                                    N=Services,CN=Configuration,DC=UCLABOR,DC=D
                                    E
Identity                          : Default Policy
OrganizationId                    :
Id                                : Default Policy
OriginatingServer                 : DC01.UCLABOR.DE
IsValid                           : True
ObjectState                       : Unchanged

Sie ist sogar änderbar, wenn man die neue SMTP-Domäne als "Accepted Domain" vorab addiert, was per Add-AcceptedDomain einfach möglich ist.

Wichtig: Starten Sie die PowerShell immer "als Administrator". Ansonsten kann z.B. Set-EMailAddressPolicy nicht auf die Address-DLL zugreifen und liefert folgenden Fehler

Set-EmailAddressPolicy : The following error occurred during validation in agent 'Rus Agent':
'Failed to valid the proxy address template "SMTP:@uclabor2.de".
Additional information: Unable to generate the e-mail address.
Unable to load address module 'C:\Program Files\Microsoft\Exchange Server\V15\Mailbox\address\SMTP\AMD64\inproxy.dll' for address type 'SMTP'.
Additional message: 'Access is denied'.. '

Exchange PowerShell ohne CAS

Nach dem Neustart können Sie einfach eine normale PowerShell starten und sich die nun neu vorhandenen Snapns anzeigen lassen.

Über den Befehl "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010" wird das relevante Modul geladen, was bei mir ca. 3 Sekunden dauert. Danach stehen aber schon am Beispiel von Exchange 2016CU3 die 1581 Commandlets bereit.

Erster Test - Failed

Natürlich habe ich gleich per Powershell, eine GUI gibt es nicht, eine Remote Mailbox anlegen wollen. Also einfach mal ein "New-Remote-Mailbox interaktiv ausgeführt und nur die verpflichtenden Daten eingegeben. Das funktionierte aber erst einmal nicht:

Der Fehler gibt aber einen klaren Hinweis, in welche Richtung ich weiter gehen muss.

New-RemoteMailbox : There is currently no remote domain configured as the
target delivery domain of your remote tenant. Either add a new remote domain
to serve as the target delivery domain or designate an existing remote domain.
At line:1 char:1
+ New-RemoteMailbox
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-RemoteMailbox], ErrorCann
   otFindTargetDeliveryDomainException
    + FullyQualifiedErrorId : [Server=EX01,RequestId=18e2cb1d-b4eb-4e08-a581-5
   47ab598dfa9,TimeStamp=30.10.2016 13:24:27] [FailureCategory=Cmdlet-ErrorCa
  nnotFindTargetDeliveryDomainException] AF4D4C53,Microsoft.Exchange.Managem
 ent.RecipientTasks.NewRemoteMailbox

Da in dem Forest natürlich auch kein "Hybrid Setup" erfolgt und auch nicht möglich ist, findet das Commandlet auch keine Domain, die für die Cloud "freigeschaltet ist"

Target Delivery Domain einrichten

Also habe ich meine Office 365 Tenant-Domain einfach als Remote Domain eingerichtet und zugleich als "TargetDeliveryDomain" aktiviert

PS C:\> New-RemoteDomain -Name carius.onmicrosoft.com -DomainName carius.onmicroft.com

Name                           DomainName                                   AllowedOOFType
----                           ----------                                   --------------
carius.onmicrosoft.com        carius.onmicroft.com                        External

# Domain fuer Hybrid 
PS C:\> Set-RemoteDomain -Identity carius.onmicrosoft.com -TargetDeliveryDomain:$true

Alle anderen Werte habe ich erst einmal auf "Default" gelassen"

Die erste Remote Mailbox

Nach diesen Vorabreiten konnte ich dann endlich eine Remote-Mailbox direkt ohne Fehler anlegen. Beachten Sie, dass das Kennwort natürlich den Kennwortrichtlinien der lokalen Domäne entsprechen muss.

PS C:\> New-RemoteMailbox `
          -UserPrincipalName test1@uclabor.de `
          -Name "Test1" `
          -Password (ConvertTo-SecureString -String "Sehr!Geheim" -AsPlainText -Force) 


Name                              RecipientTypeDetails                    RemoteRecipientType
----                              --------------------                    -------------------
Test1                             RemoteUserMailbox                       ProvisionMailbox

Die Daten des gerade angelegten Anwender kann ich direkt wieder auslesen:

PS C:\> Get-RemoteMailbox test1 | fl

RemoteRoutingAddress                   : SMTP:test1@carius.onmicroft.com
RemoteRecipientType                    : ProvisionMailbox
On-PremisesOrganizationalUnit             : uclabor.de/Users
ArchiveState                           : None
DeliverToMailboxAndForward             : False
ExchangeGuid                           : 00000000-0000-0000-0000-000000000000
MailboxContainerGuid                   :
AggregatedMailboxGuids                 : {}
ArchiveGuid                            : 00000000-0000-0000-0000-000000000000
ArchiveName                            : {}
ArchiveQuota                           : 100 GB (107,374,182,400 bytes)
ArchiveWarningQuota                    : 90 GB (96,636,764,160 bytes)
ProhibitSendQuota                      : Unlimited
ProhibitSendReceiveQuota               : Unlimited
IssueWarningQuota                      : Unlimited
ForwardingAddress                      :
ArchiveDatabase                        :
ArchiveStatus                          : None
DisabledArchiveDatabase                :
DisabledArchiveGuid                    : 00000000-0000-0000-0000-000000000000
MailboxProvisioningConstraint          :
MailboxRegion                          :
MailboxProvisioningPreferences         : {}
ExchangeUserAccountControl             : None
JournalArchiveAddress                  :
ProtocolSettings                       : {RemotePowerShell§1}
RecipientLimits                        : Unlimited
SamAccountName                         : test1 
UserPrincipalName                      : test1@uclabor.de
MailboxMoveTargetMDB                   :
MailboxMoveSourceMDB                   :
MailboxMoveFlags                       : None
MailboxMoveRemoteHostName              :
MailboxMoveBatchName                   :
MailboxMoveStatus                      : None
MailboxRelease                         :
ArchiveRelease                         :
ImmutableId                            :
PersistedCapabilities                  : {}
ResetPasswordOnNextLogon               : False
WhenMailboxCreated                     :
LitigationHoldEnabled                  : False
SingleItemRecoveryEnabled              : False
RetentionHoldEnabled                   : False
EndDateForRetentionHold                :
StartDateForRetentionHold              :
RetentionComment                       :
RetentionUrl                           :
LitigationHoldDate                     :
LitigationHoldOwner                    :
RetainDeletedItemsFor                  : 14.00:00:00
CalendarVersionStoreDisabled           : False
MailboxLocations                       : {}
IsSoftDeletedByRemove                  : False
IsSoftDeletedByDisable                 : False
WhenSoftDeleted                        :
InPlaceHolds                           : {}
RecoverableItemsQuota                  : 30 GB (32,212,254,720 bytes)
RecoverableItemsWarningQuota           : 20 GB (21,474,836,480 bytes) 
UserCertificate                        : {} 
UserSMimeCertificate                   : {}
AccountDisabled                        : False
StsRefreshTokensValidFrom              :
DataEncryptionPolicy                   :
Extensions                             : {}
HasPicture                             : False
HasSpokenName                          : False
IsDirSynced                            : False
AcceptMessagesOnlyFrom                 : {}
AcceptMessagesOnlyFromDLMembers        : {}
AcceptMessagesOnlyFromSendersOrMembers : {}
AddressListMembership                  : {\All Recipients(VLV), \Default
                                         Global Address List, \All Users}
AdministrativeUnits                    : {}
Alias                                  : test1
ArbitrationMailbox                     :
BypassModerationFromSendersOrMembers   : {}
CustomAttribute1                       :
CustomAttribute10                      :
CustomAttribute11                      :
CustomAttribute12                      :
CustomAttribute13                      :
CustomAttribute14                      :
CustomAttribute15                      :
CustomAttribute2                       :
CustomAttribute3                       :
CustomAttribute4                       :
CustomAttribute5                       :
CustomAttribute6                       :
CustomAttribute7                       :
CustomAttribute8                       :
CustomAttribute9                       :
ExtensionCustomAttribute1              : {}
ExtensionCustomAttribute2              : {}
ExtensionCustomAttribute3              : {}
ExtensionCustomAttribute4              : {}
ExtensionCustomAttribute5              : {}
DisplayName                            : Test1
EmailAddresses                         : {SMTP:test1@uclabor.de,
                                         smtp:test1@carius.onmicroft.com}
GrantSendOnBehalfTo                    : {}
ExternalDirectoryObjectId              :
HiddenFromAddressListsEnabled          : False
LastExchangeChangedTime                :
LegacyExchangeDN                       : /o=UCLABOR/ou=External (FYDIBOHF25SPDL
                                         T)/cn=Recipients/cn=8b08a8ab6a6e47dfa9
                                         0c09410439745b-Test1
MaxSendSize                            : Unlimited
MaxReceiveSize                         : Unlimited
ModeratedBy                            : {}
ModerationEnabled                      : False
PoliciesIncluded                       : {5a7f7057-e6c3-4970-9567-54cd26927c27,
                                          {26491cfc-9e50-4857-861b-0cb8df22b5d7
                                         }}
PoliciesExcluded                       : {}
EmailAddressPolicyEnabled              : True
PrimarySmtpAddress                     : test1@uclabor.de
RecipientType                          : MailUser
RecipientTypeDetails                   : RemoteUserMailbox
RejectMessagesFrom                     : {}
RejectMessagesFromDLMembers            : {}
RejectMessagesFromSendersOrMembers     : {}
RequireSenderAuthenticationEnabled     : False
SimpleDisplayName                      :
SendModerationNotifications            : Always
UMDtmfMap                              : {emailAddress:83781,
                                         lastNameFirstName:83781,
                                         firstNameLastName:83781}
WindowsEmailAddress                    : test1@uclabor.de
MailTip                                :
MailTipTranslations                    : {}
Identity                               : UCLABOR.DE/Users/Test1
IsValid                                : True
ExchangeVersion                        : 0.10 (14.0.100.0)
Name                                   : Test1
DistinguishedName                      : CN=Test1,CN=Users,DC=UCLABOR,DC=DE
Guid                                   : aec006e1-2fb4-450a-81f3-e638899d0afd
ObjectCategory                         : UCLABOR.DE/Configuration/Schema/Person
ObjectClass                            : {top, person, organizationalPerson, User}
WhenChanged                            : 30.10.2016 02:27:33
WhenCreated                            : 30.10.2016 02:27:33
WhenChangedUTC                         : 30.10.2016 01:27:33
WhenCreatedUTC                         : 30.10.2016 01:27:33
OrganizationId                         :
Id                                     : UCLABOR.DE/Users/Test1
OriginatingServer                      : DC01.UCLABOR.DE
ObjectState                            : Changed

Der UPN wurde zugleich zur primären Mailadresse.

ADSync/DirSync

Die Installation der Exchange Management Tools hat auch das Active Directory Schema erweitert. Damit wird nun im Azure Active Directory Connect die Funktion für "Exchange" erst verfügbar. Wenn Sie diese Option nicht aktivieren, dann synchronisiert Der Verzeichnisabgleich nicht die entsprechenden Daten in die Cloud.

Über die Azure AD DirSync Connect Konsole können Sie sehr einfach sehen, was aus dem lokalen Active Directory dann gelesen und über den Zwischenspeicher (MetaVerse) in die Cloud übertragen wird. Bei mir war zuerst zu sehen, dass er den User aus dem lokalen AD gelesen hat

Kurz darauf war nach dem Delta Sync auch der Export in die Cloud als "Add" zu sehen. Hier sind schon alle Properties inklusive der beiden ProxyAddresses mit gekommen.

Den Fall der "ProxyAddresses" führe ich daher gesondert auf, da diese beim nächste Synchronisierungslauf geändert zurück kommen. Die Cloud addiert wohl eine X500-Adresse, die dann auch wieder zurück nach On-Premises synchronisiert wird.

Es gibt also auch mit dem einfachen Verzeichnisabgleich durchaus ein "WriteBack" von der Cloud in das lokale Active Directory.

In der Cloud

Der nächste Blick gilt dem Objekt in der Cloud. Der User ist natürlich angelegt worden. Das kann ich in der Verwaltung als auch in der Office 365 Powershell sehen. In der Powershell ist auch schon zu sehen, dass er ein paar Exchange Felder hat. Hier ein Auszug:

PS C:\> get-msolUser -UserPrincipalName test1@uclabor.de | fl

AlternateEmailAddresses                : {}
AlternateMobilePhones                  : {}
AlternativeSecurityIds                 : {}
CloudExchangeRecipientDisplayType      : 1073741824
DirSyncProvisioningErrors              : {}
DisplayName                            : Test1
Errors                                 :
LastDirSyncTime                        : 30.10.2016 17:25:07
LastName                               :
LastPasswordChangeTimestamp            : 30.10.2016 01:27:33
LicenseReconciliationNeeded            : True
Licenses                               : {}
MSExchRecipientTypeDetails             : 2147483648
ProxyAddresses                         : {smtp:test1@fcarius.onmicrosoft.com,
                                         SMTP:test1@uclabor.de}
SignInName                             : test1@uclabor.de
UserPrincipalName                      : test1@uclabor.de
UserType                               : Member
ValidationStatus                       : Healthy

Die "Proxyaddresses" sind hier, allerdings ohne die X.500 Adresse. In de Exchange Verwaltungskonsole wird schon mehr sichtbar:

Aus meiner Sicht ist der Benutzer fehlerfrei konfiguriert und in Office 365 habe ich bislang auch keine Fehler gefunden. Sie sollten aber beachten, dass Sie nur die SMTP-Adressen hinterlegen können, die auch im Office 365 Tenant registriert sind. Schon beim Anlegen eines Cloud Only-Users wird eine Adresse einer nicht registrierten Domäne blockiert:

Das gleiche "Problem" gibt es so natürlich auch in einem Exchange Hybrid Mode und dem Abgleich per AADConnect. Allerdings generiert AADConnect keine Fehlermeldung oder Warnung, sondern die Adresse wird einfach unterschlagen. Wenn Sie die Domain später nachregistrieren, sollten Sie einen FullSync im AADConnect starten, um die vorhandenen Adressen dieser Objekte auch in Office 365 sichtbar zu machen

Zwischenstand

Die Verwaltung von Empfängern scheint mit dieser Methode problemlos möglich zu sein. Über den Support-Status gibt es natürlich keine Aussagen. Es gibt aber durchaus einige "Unstimmigkeiten", die sie aber nicht vergessen sollten. So habe ich in den vielen Commandlets einige Befehle gefunden, die es On-Premises nicht oder noch nicht gibt. Auf der Suche nach den Recipient Policies bin auch auch auf "Get-RecipientStatisticsReport" gestoßen, welches es (Stand Okt 2016) nur in Exchange Online gibt.

Ich werde den Artikel sicher aktualisieren, wenn ich einige Praxis-Erfahrung damit gemacht habe. Ich bin aber sicher, dass dieser Weg allemal besser ist, als das direkte und definitiv nicht supportete Ändern der lokalen AD-Felder per ADSIEDIT oder anderen Skripten. Die Verwaltung durch die Exchange PowerShell macht viele Aktionen deutlich einfacher und sicherer als eine direkte Verarbeitung, auch wenn ich dabei auf RBAC verzichte.

Seit Exchange 2019 CU12 vom 20. Apr 2022 gibt es nun eine Lösung mit der Exchange Management Rolle

Weitere Links