T2T Free/Busy

Wenn zwei Firmen mit Exchange Online enger zusammenarbeiten wollen, dann können die beiden Tenant Administratoren versuchen eine bessere "Zusammenarbeit" zu erreichen, z.B. indem Benutzer im anderen Tenant als Gast angelegt oder per B2B Direct Connect eingerichtet werden. Auch Empfänger der anderen Organisation können in Exchange als Kontakte angelegt werden.

Umgebung

Ich habe für meine Tests und Analysen wieder zwei Tenants genutzt. Als anfragendes Postfach habe ich einfach mein alltägliches Postfach bei Net at Work genutzt. So konnte ich einfach per Outlook und Fiddler die Anfragen auf meinem PC nachtracken. Die Gegenstelle ist ein Cloud-Postfach aus meinem Tenant UCLABOR.DE. Bislang war noch keine Partnerschaft, Kontakte o.ä. eingerichtet.

Diese Beschreibung gilt für zwei Exchange Online Umgebungen. Für einen Koexistenz-Mode mit Hybrid gelten einige andere Voraussetzungen. Siehe dazu auch Free/Busy mit OAUTH und Hybrid FreeBusy

Für die Analyse auf dem Client habe ich Fiddler als HTTP-Proxy mit SSL-Decryption eingesetzt. Die Frei/Belegt-Abfrage von Outlook ist eine klassische EWS-Abfrage gegen den Exchange Online-Server, auf dem das Postfach liegt. Outlook protokolliert normalerweise leider solche fehlerhaften Abfragen nicht im Eventlog oder einer lokalen Datei. Ich könnte aber einen Trace-Mode aktivieren, bei dem Outlook dann Dateien in "%temp%\OlkAS\Datum-Urhzeit-AS.LOG" an.

Unvorbereitet

Zuerst habe ich einfach aus meinem Postfach versucht die Frei/Belegt-Zeiten zu ermitteln. Das hat natürlich nicht funktioniert. Interessant ist hier aber schon die Fehlermeldung

Ein Mitschnitt mit Fiddler auf dem Outlook Client zeigt die HTTP-Anfrage meines Outlooks an /EWS meines Postfachservers, der in der Cloud liegt:

Interessanter ist hier die XML-Payload und Antwort, die zum einen die Anfrage nach den Frei/Belegt-Zeiten des Zielbenutzers definiert und die Antwort des Exchange Servers liefert:

Eigenes Tracing

Sie haben hier sicher gesehen, dass die Bilder von Fiddler sind. Oft ist es aber nicht möglich, dass Sie Fiddler nutzen. Dann können sie das Outlook Tracking aktivieren.

Leider landen die Daten in ETL-Dateien, die sie zur Analyse zu Microsoft senden müssten. Sie können aber mit einem Texteditor durchaus darin nach Texten suchen und vielleicht finden Sie die EWS-Anfrage und den EWS-Fehler, wenn Sie nach "EWS" suchen:

 

Einfacher ist aus meiner Sicht hier aber die Analyse mit Outlook Web App im Browser und umgehen eventuelles Caching durch OST-Dateien. Starten Sie OWA und legen sie im Kalender einen neuen Termin an. Ehe Sie nun einen Teilnehmer einladen, starten Sie mit F12 den Chromium Debugger und gehen auf den Reiter "Netzwerk". Aktivieren Sie dort die Einstellung "Protokoll beibehalten" und addieren Sie dann in OWA den fraglichen Benutzer. Über die Suche finden Sie dann schnell einen Request an "service.svc":

Die Fehlermeldung ist im Bild natürlich abgeschnitten aber sollte ihnen bei der Lösung helfen.

Fehlerbilder

Folgende verschiedene Fehlermeldungen habe ich versucht zu provozieren.

  • Kein Organisation Relationship
    Wenn ich im anfragenden Tenant keinen passenden Eintrag habe, dann scheint Exchange aber nach einem Kontakt zu suchen. Den Fehler bekommen Sie weg, wenn Sie auf ihrer Seite die Domain im Rahmen einer "Organization Relationship einrichten"
Microsoft.Exchange.InfoWorker.Common.Availability.MailRecipientNotFoundException: 
Unable to resolve e-mail address user2@msxfaqlab.onmicrosoft.com to an Active Directory object.
. Name of the server where exception originated: PA4PR04MB9344. LID: 35938
  • Lokaler Kontakt eingerichtet
    Wenn ich kein Organization Relationship eingerichtet habe aber einen AD-Kontakt pflege, dann ist das für Exchange Online auch die Erlaubnis die Anfrage zu stellen. Wenn die Gegenseite natürlich nicht mitspielt, dann bekomme ich folgenden Fehler.
Autodiscover failed for email address user1@uclabor.de with error Microsoft.Exchange.InfoWorker.Common.Availability.AutoDiscoverInvalidUserException: 
The response from the Autodiscover service at 'https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc/WSSecurity' 
failed due to an error in user setting 'ExternalEwsUrl'. Error message: InvalidUser.
. Name of the server where exception originated: PA4PR04MB9344. LID: 33676., 
inner exception: The response from the Autodiscover service at 'https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc/WSSecurity' failed 
due to an error in user setting 'ExternalEwsUrl'. Error message: InvalidUser. LID: 33676
  • Einseitiges Organization Relationship eingerichtet
    Die anfragende Organisation ist für die Gegenseite freigeschaltet aber die Gegenseite erlaubt keine Anfrage
Autodiscover failed for email address user1@uclabor.de with error Microsoft.Exchange.InfoWorker.Common.Availability.AutoDiscoverInvalidUserException:
The response from the Autodiscover service at 'https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc/WSSecurity' 
failed due to an error in user setting 'ExternalEwsUrl'. Error message: InvalidUser.
. Name of the server where exception originated: PA4PR04MB9344. LID: 33676., 
inner exception: The response from the Autodiscover service at 'https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc/WSSecurity' failed 
due to an error in user setting 'ExternalEwsUrl'. Error message: InvalidUser. LID: 33676
  • Fehler im Zielsystem
    Ich habe auch eine Domain eingerichtet, die aber auf einen On-Premises-Server verweist, der aber nicht funktioniert.
<S:Fault xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Code><S:Value>S:Sender</S:Value><S:Subcode><S:Value>wst:FailedAuthentication</S:Value>
</S:Subcode></S:Code><S:Reason>
<S:Text xml:lang="en-US">Authentication Failure
</S:Text></S:Reason><S:Detail><psf:error xmlns:psf="http://schemas.microsoft.com/Passport/SoapServices/SOAPFault">
<psf:value>0x80048800</psf:value><psf:internalerror><psf:code>0x80048800</psf:code>
<psf:text>AADSTS901124: Application 'fydibohf25spdlt.carius.de' does not exist.</psf:text>
</psf:internalerror></psf:error></S:Detail></S:Fault>
Microsoft.Exchange.Net.WSTrust.SoapFaultException: Soap fault exception received.
   at Microsoft.Exchange.Net.WSTrust.SoapClient.EndInvoke(IAsyncResult asyncResult)
   at Microsoft.Exchange.Net.WSTrust.SecurityTokenService.EndIssueToken(IAsyncResult asyncResult)
   at Microsoft.Exchange.InfoWorker.Common.Availability.ExternalAuthenticationRequest.Complete(IAsyncResult asyncResult)

Microsoft pflegt dazu sogar eine PDF-Datei:

FB_Errors.FixesV6.pdf
https://techcommunity.microsoft.com/legacyfs/online/media/2019/01/FB_Errors.FixesV6.pdf 

Wenn Sie weitere Fehler haben, dann freue ich mich über ein Feedback mit der Fehlermeldung und vielleicht dem Hinweise.

Organization Relationship

Wie sie oben ja gesehen haben, entscheidet jede Firma selbst, welche Informationen sie an welche Partner frei geben. In unserem Bild haben wir nun die anfragende und die angefragte Organisation.

  • Anfragende Organisation
    Wenn ich meinen Benutzer erlauben möchte, dass Sie Frei/Belegt-Zeiten von anderen Firmen abfragen, dann muss ich ein "Organization Relationship" oder entsprechende Org-Kontakte anlegen.
  • Angefragte Organisation
    Die Gegenseite muss mir das natürlich erlauben. Der Administrator der Gegenseite sollte hier seine "Sharing Policy" kontrollieren oder ebenfalls eine "Organization Relationship" einrichten.

Wenn Sie eine Organization Relationship eingerichtet haben, können Sie keine SharingPolicy für diese Domains anlegen:

Es ist daher gelebte Praxis, dass zwei "befreundete" Firmen sich Gegenseitig als "Organization Relationship" eintragen. Hier am Beispiel einer Seite:

Über den gleichen Weg kann ich natürlich steuern, was ich meinerseits für die andere Firma freigebe. Ich muss hier nur eine Domain der Gegenseite angeben. Über die Autodiscover-Funktion findet Exchange schon alle anderen Domains heraus. Schauen Sie sich dazu einfach den neuen Eintrag nach dem Speichern noch einmal an.

Die Application URL und der Autodiscover-Endpunkt verweist hier auf die Cloud mit folgenden Werten:

Application URL:       outlook.com
Autodiscover Endpoint: https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc/WSSecurity

Das gilt natürlich nur, wenn die Domain zu 100% in der Cloud ist. Wenn die Zielumgebung im Exchange Hybrid Mode arbeitet, dann sehen die Werte natürlich anders aus, z.B.

Application URL:       FYDIBOHF25SPDLT.netatwork.de
Autodiscover Endpoint: https://autodiscover.netatwork.de/autodiscover/autodiscover.svc/WSSecurity

Das bedeutet dann aber, dass sie nicht die Free/Busy-Zeit einer Exchange Online Mailbox der anderen Seite über diesen Weg finden. Auf der Seite Hybrid FreeBusy habe ich beschrieben, dass Sie in dem Fall die "<tenantname>.mail.onmicrosoft.com"-Domain über eine "Organization Relationship" einrichten und den Anwendern sagen, dass die diese doch untypische Adresse verwenden sollen. Besser ist hier dann natürlich die Anlage eines MailContacts beim Benutzer oder in Exchange Online, damit der Anwender den Benutzer in der anderen Organisation elegant und korrekt auswählen kann.

Mir ist im Moment kein besserer Weg bekannt und leider unterstützt der Free/Busy-Lookup keinen Redirect des lokalen Exchange Servers in die Cloud in einer Hybrid-Bereitstellung.

Das bedeutet aber auch, dass diese Einträge "statisch" sind, d.h. wenn die andere Firma weitere Domains in ihrem System eintragen und die Frei/Belegt-Zeiten dazu ebenfalls erreichbar sein sollen, müssen die Partnerfirmen die Domainliste aktualisieren.

Ergebnis

Erwarten Sie nicht, dass die Änderungen "sofort" aktiv werden. Exchange Online besteht aus sehr vielen Exchange Servern und einige Informationen werden von den Servern im Cache gehalten. Über Fiddler habe ich gesehen, dass Outlook zumindest keinen Cache hat, sondern jedes Mal per EWS neu anfragt.

Nachdem auf beiden Seiten die "Organization Relationship" korrekt eingetragen wurde, konnte ich auch problemlos die Frei/Belegt-Zeiten erhalten und anzeigen.

Weitere Links