Hybrid FreeBusy

Die Planung von Terminen funktioniert besser, wenn der Einladende sofort sehen kann, ob und wann die Teilnehmer in ihrem Kalender noch Zeit haben. Microsoft Exchange hat dazu eine passende Lösung, bei der Outlook den eigenen Exchange Server fragt, der dann über Internet die anderen Exchange Server um Auskunft bittet. Der Administrator muss das nur einrichten. Wie sieht das aber aus, wenn eine Firma nun Exchange Hybrid hat oder beide Firmen schon Hybrid fahren?

Die Lösung

Diese Seite ist etwas länger und ich möchte nicht, dass Sie alles durchlesen und am Ende erkennen, das es zwar ein Abstieg in die Tiefen von Exchange ist, aber bei ihnen gar nicht zutrifft. Hier geht es um die Anzeige der Frei/BelegtZeiten zwischen getrennten Exchange Umgebungen, bei denen ein Teil der Postfächer in Exchange Online liegt.

Leider ist die Lösung alles andere als elegant. Sie brauchen ganz viele Kontakte und ähnlich wie bei Migrationen einige Routingdomänen.

Man kann es umsetzen aber es ist ein größerer Aufwand, denn:

  • Jede abgefragte Exchange Umgebung braucht zwei SMTP Domänen, damit die Anfragen ans richtige Ziel geroutet werden
  • Die abfragende Exchange Umgebung muss MailContacts oder MailUser pflegen, deren TargetAddress auf die Exchange Plattform verweist, auf der das Postfach zu finden ist
    Migriert also Firma2 ein Postfach in die Cloud, muss Firma1 seinen Kontakt anpassen. Das geht also nur sinnvoll, wenn die Firmen kooperativ zusammenarbeiten und ein Verzeichnisabgleich diese Pflege zeitnah automatisiert..

Exchange agiert leider nicht als Proxy o.ä. um diese Konstellation zu vereinfachen. Wenn Sie nun noch interessiert sind, dann lesen Sie gerne weiter.

Organzation Relationship

Zuerst schauen wir uns die grundlegende Konfiguration noch einmal an, wenn zwei Exchange Organisationen eine engere Zusammenarbeite miteinander vereinbaren. Die anfragende Organisation muss einen Eintrag anlegen, mit der die Anfragen an die andere Organisation erlaubt werden und die andere Organisation muss hinterlegen, welche Informationen sie bereit ist zu teilen. Wir sprechen hier von der "Organization relationship". Etwas anders ist die "Sharing Policy", die mehr Andere Möglichkeiten eröffnet, z.B. auch das Teilen von Kalendern mit Inhalten.

Beide Einstellungen sind an der gleichen Stelle aber in zwei unterschiedlichen Reitern.

  • Allgemein
    Bestimmt, dass ihre Organisation die andere Domain anfragen kann und wie Sie dort anfragt
  • Freigabe
    Dort bestimmen Sie, in welchem Umfang Sie Informationen an die andere Organisation freigeben.

Nur zur Sicherheit: Die Anzeige von Frei/Belegt-Zeiten innerhalb einer Exchange Organisation bedarf keiner weiteren Konfiguration

Bedeutung der URLS

Bei so einer "Organisation Relationship" finden Sie nach der Einrichtung zwei Informationen unter "Allgemein":

Es gibt eine Anwendungs-URL und einen Endpunkt für die Auto-Ermittlung. Die hat Exchange bei der Anlage der Federation gleich selbst angelegt.

Gegenstelle TargetApplicationUri TargetAutodiscoverEpr

OnPremises

FYDIBOHF25SPDLT.<maildomain>
https://autodiscover.<maildomain>.de/autodiscover/autodiscover.svc/WSSecurity

Office 365

outlook.com
https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc/WSSecurity

Der Assistent ermittelt also diese Werte und verbindet sich damit. Sollte dies nicht möglich sein, verhindert die GUI die Anlage der "Organization Relationship"

Sie können natürlich per PowerShell diese Eintragungen auch manuell setzen.

New-OrganizationRelationship `
   -name <name> `
   -domainnames <domänen>

Allerdings gibt es hier keinen Assistenten und die Parameter bleiben leer. Sie können diese dann wie auch weitere Parameter manuell pflegen. zudem gibt es noch weitere Parameter, die nur per Powershell gesetzt werden können, z.B.

  • TargetOwaURL
  • TargetSharingEpr
    Über diesen Parameter können Sie den Zugriff des Exchange Servers auf die entfernte Seite vorgeben, wenn die entfernte Seite z.B. autodiscover nicht korrekt umgesetzt hat
    Ein möglicher Wert sieht z.B. so aus: "https://mail.msxfaq.de/ews/exchange.asmx"

Bedenken Sie immer, dass diese "Organization Relationship" nicht nur zwischen verbundenen Unternehmen genutzt wird, sondern auch eine Basis für eine Migration von Benutzern zwischen Exchange Topologien ist. Und da ist es doch hilfreich, wenn ein Anwender beim Zugriff auf die falsche URL per OWA einen netten Hinweis auf die richtige URL bekomme

Sie müssen also für jede Konfiguration auf der einen Seite auch das Gegenstück auf der anderen Seite einrichten.

Es reicht nicht nicht, wenn Firma1 die Abfrage an Firma2 stellt. Die Firma2 muss die Abfrage der Frei/Belegt-Zeiten auch erlauben.

Autodiscover Proxy und Redirect

Für die nächsten Abschnitte ist es wichtig zu verstehen, wie Exchange Server eine an sie gestellte Free/Busy-Abfrage behandeln. Wenn ein Outlook-Client sich mit seinem Postfach verbindet und auf dem falschen Server gelandet ist, dann kann Autodiscover im einen Verweis auf den "richtigen Server geben. Innerhalb der gleichen Exchange Topologie sucht Exchange den dem Postfach naheliegenden Frontend-Server und liefert deren InternalURL/ExternalURL als XML-Antwort aus. Wenn der Benutzer aber in einer anderen Exchange Topologie (Cross Org Migration) oder z.B. in der Cloud ist, dann hat das Postfach eine TargetAddress und Autodiscover sendet dem Benutzer einen Redirect als XML-Antwort.

Bei Free/Busy-Anfragen eines Client an einen Exchange Server erfolgt keine derartige Umleitung. Der Client verbindet sich immer nur mit "seinem" Server und es ist die Aufgabe des Servers, eine Verbindung zur entsprechenden Gegenstelle aufzubauen, sich als Server zu authentifiziere, die Daten abzurufen und dem Client auszuhändigen. Das gilt sowohl für die Federation in der gleichen Firma zwischen einer OnPremises Installation und einer Exchange Online-Instanz mit dem Hybrid-Mode aber auch bei einer Federation zwischen Firmen:

In dem Artikel steht z.B. für die Federation innerhalb einer Hybrid-Umgebung ein ganz interessanter Abschnitt:

1. Joe creates a meeting request and adds Jane as an attendee.
2. The on-premises Exchange server in Contoso determines (usually based on Target Address of the mail-enabled user) that Jane is not a local mailbox and has a different domain name of contoso.mail.onmicrosoft.com set as the Target Address.
3. The Availability Service on the on-premises Exchange server (Client Access Server if Ex2010 or Mailbox Server if 2013/2016) in Contoso then checks to see if there is a path to query Jane’s Free/Busy information for Contoso’s cloud side.
Quelle: https://techcommunity.microsoft.com/t5/exchange-team-blog/demystifying-hybrid-free-busy-what-are-the-moving-parts/ba-p/607704#

Wenn ich einen OnPremises Server fragen, dann agiert er als Proxy, um die Anfrage in die Cloud zu übertragen. Bei Exchange 2010 macht das noch dis CAS-Rolle und bei Exchange 2013/2016 macht es aber die Mailbox Rolle. Diese Rolle muss also über das Internet die Office 365 Server erreichen können.

Auch in die Gegenrichtung gibt es dazu ein Statement:

1. Jane creates a meeting request and adds Joe as an attendee
2. The Exchange Online servers in Contoso-cloud side organization determine (usually based on target address of a mail-enabled user) that Joe is not a local mailbox and has a domain name of contoso.com set as the target address.
3. The Availability Service on Exchange Online servers checks to see if there is a path for it to find the Free/Busy information for Contoso on-premises side organization.
Quelle: https://techcommunity.microsoft.com/t5/exchange-team-blog/demystifying-hybrid-free-busy-what-are-the-moving-parts/ba-p/607704#

Das ist soweit also schon mal klar, dass Exchange 2010-2016 (und 2019 vermutlich genauso) als Proxy-Server. Das gilt aber nur innerhalb der Organisation, d.h. die anfragenden Benutzer sind an dem Exchange Server authentifiziert.

Aus der Ecke von Exchange - Autodiscover sollten Sie noch wissen, dass die Einträge für "autodiscover.<maildomain>" solange auf die lokale Exchange Umgebung verweisen müssen, solange es noch ein Postfach dort gibt. Eine Autodiscover-Anfrage für ein Postfach wird vom lokalen Server mit der passenden Internal/ExternalURL oder mit einer Umleitung in die Cloud beantwortet.

In die Gegenrichtung ist das mit AutodiscoverV1 nicht möglich. Wenn ihr Outlook bei der Verbindung durch einen Konfigurationsfehler die Cloud fragt, dann wird er nicht auf die OnPremises-Umgebung verwiesen. Mit Autodiscover V2 sieht das anders aus.

Konstellationen

Da Exchange nur bei der Einrichtung der "Organization Federation" die Parameter ermittelt und dann statisch interlegt, gibt es einige Fälle, die funktionieren und andere, die nicht funktionieren. In den folgenden vier Szenarien befasse ich mir nur mit dem Zugriffe von Firma1 auf die Frei/Belegt-Zeiten von Anwendern bei Firma2. Die Firma2 ist im Hybrid-Mode mit Exchange OnPremises und Exchange Online. Firma1 kann OnPremises Only, Cloud Only oder Hybrid Only sein. Die Funktion ist immer ausgehend von dem Homeserver, auf dem der anfragende Benutzer liegt. Zudem hat Firma2 den Zugriff von Firma1 als Sharing Policy schon eingerichtet.

  Beschreibung

Sie konfigurieren auf dem OnPremises von Firma 1 den Zugriff auf die OnPremises Umgebung von Frma2

  • Die Anwender von Firma 1 sehen die Frei-Belegt-Zeiten der OnPremises Anwender in Firma 2.
  • Die Anwender von Firma 1 sehen NICHT die Frei-Belegt-Zeiten der Cloud Anwender in Firma 2.

Sie konfigurieren auf dem OnPremises von Firma 1 den Zugriff auf die Cloud Services von Firma2

  • Die Anwender von Firma 1 sehen NICHT die Frei-Belegt-Zeiten der OnPremises Anwender in Firma 2
  • Die Anwender von Firma 1 sehen die Frei-Belegt-Zeiten der Cloud Anwender in Firma 2

Sie konfigurieren auf dem Cloud Server von Firma 1 den Zugriff auf die Cloud von Firma2

  • Die Anwender von Firma 1 sehen NICHT die Frei-Belegt-Zeiten der OnPremises Anwender in Firma 2
  • Die Anwender von Firma 1 sehen die Frei-Belegt-Zeiten der Cloud Anwender in Firma 2

Sie konfigurieren auf dem Cloud Server von Firma 1 den Zugriff auf die Cloud der Firma 2

  • Die Anwender von Firma 1 sehen die Frei-Belegt-Zeiten der OnPremises Anwender in Firma 2.
  • Die Anwender von Firma 1 sehen NICHT die Frei-Belegt-Zeiten der Cloud Anwender in Firma 2.

 

Ich habe die funktionierenden Zugriffe mit grünen Pfeilen dargestellt und die roten Pfeile zeigen, was nicht geht. Zwei Dinge sind nicht programmiert:

  • Keine Proxy-Funktion
    Auch denn innerhalb der Firma 2 die Frei-Belegt-Zeiten zwischen den beiden Exchange Umgebungen natürlich funktionieren, kann der von extern angefragte Exchange Server die Anfrage nicht "on Behalf" auf die andere Seite weiter geben.
  • Kein Redirect
    Es passiert aber auch nicht, das der Server von Firma1 eine Umleitung vom angefragten Server erhält und selbst eine zweite Anfrage an den anderen Server stellt.

Beide Funktionen wären für Exchange aus meiner Sicht relativ schnell programmiert, denn die Proxy-Funktion ist für Outlook-Clients ja schon vorhanden. Wenn der angefragte Server die Frei/Belegt-Zeiten für einen angemeldeten Benutzer ausliefert, dann könnte er ja auch eine legitime Anfrage eines Exchange Servers einer vertrauten Organisation so bedienen.

"Überraschend" ist das aber nicht, denn Microsoft hat das schon dokumentiert:

Exchange organizations that have both on-premises and cloud users: If you set up calendar sharing with another Exchange organization that is configured in a hybrid deployment with Microsoft Office 365, free/busy availability lookups for Office 365-based or remote users that have been moved to the cloud will fail. Because the organization relationship for your Exchange organization is with the remote on-premises Exchange organization, not the Office 365-based Exchange Online organization, the free/busy request can't query the Office 365-based users. Exchange 2013 doesn't support functionality to proxy these availability requests through the on-premises organization to the Office 365 service.
https://docs.microsoft.com/en-us/exchange/sharing-exchange-2013-help?redirectedfrom=MSDN#CB

Allerdings beschreibt der Artikel alles mit Exchange 2007/2010/2013. Ich habe aber noch einen zweiten Blog-Artikel gefunden, der auf das Hybrid-Szenario sehr gut eingeht:

Lösung über Kontakte

In dem Artikel "The Hybrid Mesh" (https://techcommunity.microsoft.com/t5/exchange-team-blog/the-hybrid-mesh/ba-p/605910) hat Microsoft auch die Lösung beschrieben. Bezogen auf meine beiden Firmen muss Firma 1 zwei eigenen "Organization Trust" zu je einer Gegenseite einrichten. Dabei sind unterschiedliche Domänen zu verwenden. Wenn Firma1 selbst auch schon im Hybrid Mode ist, dann sind das je zwei Vertrauensstellung je Exchange Umgebung. In die Gegenrichtung ist das alles noch einmal zu konfigurieren.

Ausgehender Trust   Domain

Firma1 (OnPrem) -> Firma 2 (OnPrem)

onprem.firma2.tld

Firma1 (OnPrem) -> Firma 2 (Cloud)

firma2.mail.onmicrosoft.com

Firma1 (Cloud) -> Firma 2 (Cloud) 

onprem.firma2.tld 

Firma1 (Cloud) -> Firma 2 (OnPrem) 

firma2.mail.onmicrosoft.com

Firma2 muss natürlich diese "Routing Domänen" als zusätzliche SMTP-Adressen bei all seinen Empfängern addieren. Damit die neuen Verbindungen aber wirken, müsste der Anwender nun diese neuen Domänen für die Empfänger verwenden. Das können Sie den Anwendern aber nicht wirklich zumuten. Sie wissen vermutlich schon, was nun passiert.

MailUser oder MailContacts mit der Targetaddresse sind zu pflegen 

Sie legen als für die Postfächer in Firma2 auf ihrer Seite bei Firma1 entsprechende Kontakte mit einer Targetaddresse auf das aktuelle Postfach an. Natürlich müssen Sie die Partnerbeziehungen wie in der Tabelle einrichten.

Die Targetadresse muss natürlich immer auf das passende Zielsystem verweisen, denn ein Refer, Redirect oder Proxy findet nicht statt.

Das Bild zeigt zudem nur die Verbindung von Firma1 zu Firma2. Wenn auch die Mitarbeiter von Firma2 die Frei/Belegt-Zeiten von Firma1 sehen wollen, dann muss das gleiche Setup spiegelverkehrt erfolgen.

Ich finde diesen Aufwand und die Einschränkungen alles andere als glücklich gelöst. Da dies aber schon mehrere Jahre der Fall ist und anscheinend keine hohe Priorität hat, erwarte ich auch keine Verbesserungen in nächster Zeit. Sie können also ohne Kontakte und diese Konfiguration nur akzeptieren, dass Sie nur von einem Teil der Benutzer in einem verbundenen Unternehmen die Frei/Belegt-Zeiten sehen.

Fehler und Ursachen

Bis dieser Artikel geschrieben war und ich die verschiedenen Quellen alle gefunden habe, habe ich mit mehreren Tenants und OnPremises-Umgebungen verschiedene Konstellationen ausprobiert und auf einem Outlook-Client mit Fiddler die EWS-Anfragen analysiert. Ich habe hier unterschiedliche Fehler gefunden, die ich hier vorstelle. Vielleicht stoßen Sie ja auch auf die Fehler und finden so vielleicht die Ursache. Einige Fehler sind auch durchaus aufschlussreiche, als wenn Microsoft einige Funktionen doch schon ansatzweise aber nicht komplett programmiert hat

  • Proxy web request failed
    Ich habe von Firma1 die Exchange Online Instanz von Firma2 nach einem Benutzer gefragt, der bei Firma2 OnPremises lag. Ich konnte tatsächlich im Fehler sehen, dass die Cloud anscheinend eine Verbindung zum lokalen Exchange Server aufgebaut hat. Allerdings zu einer IP-Adresse die es nicht mehr gibt, weil dieser Tenant schon "Modern Hybrid" mit einem Agenten nutzt. Exchange Online scheint hier also noch nicht mit Modern Hybrid kompatibel zu sein. Ich kann aber nicht sagen, ob es dann funktioniert hätte, denn die Authentifizierung ist ja noch nicht geklärt.
Proxy web request failed. ,
 inner exception: System.Net.WebException: Unable to connect to the remote server
 ---&gt; System.Net.Sockets.SocketException: No connection could be made because 
the target machine actively refused it xx.xx.xx.xx:443  (=hybrid.msxfaq.com)
  • Unbekannter Benutzer
    Beim Versuch die Frei/Belegt-Zeiten eines nicht in Exchange Online existierenden Benutzers abzufragen, kam die folgende Meldung.
Microsoft.Exchange.InfoWorker.Common.Availability.MailRecipientNotFoundException: 
Unable to resolve e-mail address user@msxfaq.com to an Active Directory object.. 
Name of the server where exception originated: AM0PR0402MB3442
  • SOAP Error
    Diese Fehler ist bei einer Verbindung von Exchange Online zu Exchange OnPremises gekommen. Ich vermute auch hier, dass der Exchange Server sehr wohl meine Anfrage als Proxy weiter gegeben hat aber die andere Seite dann mangels Authentifizierung abgebrochen hat.
Proxy web request failed. , inner exception: System.Web.Services.Protocols.SoapHeaderException: An error occurred when verifying security for the message.
  • OnPremises zur Cloud
    Hier kommt nun ein sauberer 401-Fehler, denn der lokale Exchange Server um die F/B-Zeiten eines Cloud-Users gefragt wird. Für mich bedeutet das aber auch, dass der Exchange Server durchaus die Proxy-Funktion Richtung Cloud haben könnte und sich nur nicht anmelden kann, da er für den fragenden Anwende der anderen Organisation kein OAUTH-Token bekommt.
Proxy web request failed. , inner exception: System.Net.WebException: The request failed with HTTP status 401: Unauthorized.
  • Tippfehler in Application
    Wenn Sie genau hinschauen, dann finden Sie einen Tippfehler "Outllook" in der AppID, welche dann von der Gegenseite natürlich nicht gefunden wird
Fail  &lt;S:Fault xmlns:S="http://www.w3.org/2003/05/soap-envelope"&gt;
&lt;S:Code&gt;&lt;S:Value&gt;S:Sender&lt;/S:Value&gt;
&lt;S:Subcode&gt;&lt;S:Value&gt;wst:FailedAuthentication&lt;/S:Value&gt;
&lt;/S:Subcode&gt;&lt;/S:Code&gt;&lt;S:Reason&gt;
&lt;S:Text xml:lang="en-US"&gt;Authentication Failure&lt;/S:Text&gt;
&lt;/S:Reason&gt;&lt;S:Detail&gt;
&lt;psf:error xmlns:psf="http://schemas.microsoft.com/Passport/SoapServices/SOAPFault"&gt;
&lt;psf:value&gt;0x80048800&lt;/psf:value&gt;&lt;psf:internalerror&gt;
&lt;psf:code&gt;0x80048800&lt;/psf:code&gt;
&lt;psf:text&gt;AADSTS901124: Application 'outllook.com' does not exist.&lt;/psf:text&gt;
&lt;/psf:internalerror&gt;&lt;/psf:error&gt;&lt;/S:Detail&gt;
&lt;/S:Fault&gt; Microsoft.Exchange.Net.WSTrust.SoapFaultException: Soap fault exception received.
  • Public Folder Mailbox
    Bei der Suche nach einer lokalen Mailbox habe ich aus versehen die "Public Folder Mailbox" der OnPremises-Umgebung eingeladen. Hier kamen dann andere Fehlermeldungen von der Cloud
Microsoft.Exchange.InfoWorker.Common.Availability.AutoDiscoverFailedException: 
Exceeded the number of Autodiscover redirections for e-mail pfmailbox1@msxfaq.de. 
The maximum allowed redirections are 3. Name of the server where exception originated: DM5PR20MB2119. LID: 53772
Autodiscover failed for email address pfmailbox@msxfaq.de with error Microsoft.Exchange.InfoWorker.Common.Availability.AutoDiscoverInvalidUserException: 
The response from the Autodiscover service at 'https://autodiscover.msxfaq.de/autodiscover/autodiscover.svc/WSSecurity' 
failed due to an error in user setting 'ExternalEwsUrl'. 
Error message: InvalidUser.
  • PF Mailbox und OnPremises
    Ich habe dann einfach noch mal direkt den lokalen Exchange Server nach den F/B-Zeiten der Public Folder Mailbox gefragt
Mailbox logon failed., 
inner exception: Microsoft.Exchange.Data.Storage.AccessDeniedException: 
This operation is not supported on a public folder mailbox.

Hier habe ich dann meine Test-Serie eingestellt.

Weitere Links