Outlookcloudsettings

Diese Seite behandelt den Konfigurationsspeicher von Outlook in Exchange Online, der über einen REST-Endpunkt unter substrate.office.com angesprochen wird.

Diese API ist von Microsoft nicht offiziell dokumentiert.

Auslöser

Im Frühjahr 2023 hat Microsoft die neue Funktion bereitgestellt, dass Outlook 365 die Signaturen in der Cloud speichern kann. Bislang wurden diese Daten lokal als Datei abgelegt oder OWA hat diese in einer versteckten Nachricht im Postfach hinterlegt. Bei de waren nicht synchron und nun gibt es einen weiteren Speicherplatz, der aber nur mit Exchange Online und Outlook 365 genutzt wird. In dem Zuge wollte ich wissen, wo Outlook diese Daten abspeichert und habe mit Fiddler dem Protokoll auf die Finger geschaut. Dabei habe ich deutlich mehr gefunden, als nur einen Speicherplatz für Signaturen/Disclaimer.

Der Prozess "Outlook.exe" greift hier nicht auf "outlook.office.com" per EWS oder über graph.microsoft.com auf die Einstellungen zu, sondern nutzt einen Host, der bislang eher selten bekannt sein dürfte. Der Zugriff erfolgt über eine REST-API, die aber auf "substrate.office.com" geht.

Substrate?

Über den Datenspeicher "Substrate" ist auch im Jul 2023 noch recht wenig bekannt. Ist es noch ein weiterer Speicher oder nur ein anderer Zugriff auf Daten, die im Hintergrund dann doch im Postfach des Anwender oder SharePoint der Firma oder OneDrive des Anwenders liegen? Wie wird der Platz dann provisioniert und abgerechnet? eine Quelle ist z.B. Jeffrey Snover auf Microsoft Mechanics in 2019 sagte:

...
a set of storage and a set of services”, was the “heart of Office 365.” The services are for “creating, collaborating, and communicating” and “everything gets stored in the substrate or has a digital twin (copy) in the substrate.” Collectively, the substrate enables Office 365 a “planetary scale people operating system.”
Everything ist stored in the Substrate or gets a digital twin

Quelle: Jeffrey Snover, Microsoft Technical Fellow and Architect for the Intelligent Substrate Platform in Office 365, (https://www.youtube.com/watch?v=uuiTR8r27Os)

Ansonsten hat auch Tony Redmond schon einige Dinge beschrieben, nach denen es es einen versteckten "Files"-Ordner im Exchange Online Postfach gibt, welcher nicht gerade klein ist und solche Daten halten könnte:

Microsoft 365 internals explained | Microsoft Graph, substrate, and PowerShell with Jeffrey Snover
https://www.youtube.com/watch?v=uuiTR8r27Os

API: Authentication

Wenn ich mir die Abfragen und Antworten von Fiddler ansehe, dann liegen im "substrate" schon einige Daten, die mich auch als Administrator interessieren, vor allem um diese für den Anwende z.B. einzustellen. Zuerst schaue ich auf die Authentifizierung. Hier finde ich zwei Verfahren.

Einmal die klassische "Bearer"-Authentication" aber auch eine "Password1.4"-Anmeldung für Konten, die ein Microsoft-Konto (Outlook.com) nutzen. Das Bearer-Token lässt sich wieder einfach decodieren. (gekürzt)

{
  "typ": "JWT",
  "alg": "RS256",
}.{
  "aud": "https://outlook.office.com",
  "iss": "https://sts.windows.net/de21c301-a4ae-4292-aa09-6db710a590a6/",
  "app_displayname": "Microsoft Office",
  "appid": "d3590ed6-52b3-4102-aeff-aad2292ab01c",
  "name": "Carius, Frank (NAW)",
  "scp": "Branford-Internal.ReadWrite 
          Calendars.ReadWrite Calendars.ReadWrite.Shared 
          Contacts.ReadWrite Contacts.ReadWrite.Shared 
          EAS.AccessAsUser.All EopPolicySync.AccessAsUser.All EopPsorWs.AccessAsUser.All 
          EWS.AccessAsUser.All Files.ReadWrite.All 
          Files.ReadWrite.Shared Group.ReadWrite.All Mail.ReadWrite 
          Mail.ReadWrite.Shared Mail.Send Mail.Send.Shared MailboxSettings.ReadWrite 
          MapiHttp.AccessAsUser.All MessageReaction-Internal.Update 
          Notes.Read Notes.ReadWrite Oab.AccessAsUser.All OutlookService.AccessAsUser.All OWA.AccessAsUser.All 
          People.Read People.ReadWrite Place.Read.All Privilege.ELT Signals.Read Signals.ReadWrite 
          SubstrateSearch-Internal.ReadWrite Tags.ReadWrite 
          Tasks.ReadWrite Tasks.ReadWrite.Shared Todo-Internal.ReadWrite 
          User.ReadBasic User.ReadBasic.All 
          user_impersonation User-Internal.ReadWrite",
  "upn": "user1@mxfaq.net",
  "ver": "1.0",
  "wids": [
    "790c1fb9-7f7d-4f88-86a1-ef1f95c05c1b",
    "b79fbf4d-3ef9-4689-8143-76b194e85509"
  ],
}.[Signature]

Interessant ist hier die lange Liste der SCP-Einträge und das "user_impersonate". Die App "Microsoft Office" ist mit der GUID "d3590ed6-52b3-4102-aeff-aad2292ab01c" angegeben

API: Lesen

Beim Zugriff auf die API sehe ich zwei Fälle. Einmal liest der Client die Einstellungen. In der Regel sendet der Client dazu einen HTTP-Request ohne Payload.

GET https://substrate.office.com/ows/beta/outlookcloudsettings/settings/global?timestamp=638237514915454295&force=true HTTP/1.1
Connection: Keep-Alive
Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJ0e.....
User-Agent: Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.16529; Pro)
x-anchormailbox: PUID:<id>@<tenantguid>
x-islargesetting: false
Host: substrate.office.com

Natürlich ist eine Authentication mit Bearer drin und auch eine Anchor-Mailbox wird mitgeliefert. Das ist dann schon ein deutliches Zeichen, dass hier Exchange im Hintergrund genutzt wird, denn die Anchor-Mailbox gibt es auch bei MAPI/HTTP und EWS/HTTP. Die JSON-Antwort ist größer und ich liefere hier nur die ersten beiden Einstellungen

[
  {
    "name": "onlinemeetings_enabledbydefault",
    "value": "True",
    "type": "Bool",
    "source": "SystemDefault",
    "scope": "user1@mxfaq.net",
    "parentSetting": "",
    "Timestamp": 638237578992034007,
    "itemClass": "RoamingSetting"
  },
  {
    "name": "hybrid_rsvp_enabled",
    "value": "True",
    "type": "Bool",
    "source": "TenantDefault",
    "scope": "user1@mxfaq.net",
    "parentSetting": "",
    "Timestamp": 638237578992113046,
    "itemClass": "RoamingSetting"
  },

Wenn ich nur die Zeilen mit einem "name" ausgehe, dann sehen Sie schnell alle Einstellungen, die der Client auf die Anfrage hin geliefert bekommt:

Zeile  13:     "name": "hybrid_rsvp_enabled",
Zeile  23:     "name": "UserOptionsMigrationState",
Zeile  33:     "name": "navigationbarwidth",
Zeile  43:     "name": "PackageDeliveryEventsFromEmailSystemDefault",
Zeile  53:     "name": "FavoritesBitFlags",
Zeile  63:     "name": "EventsFromEmailEnabled",
Zeile  73:     "name": "IsOptimizedForAccessibility",
Zeile  83:     "name": "ReportEventsCreatedFromEmailEnabled",
Zeile  93:     "name": "IsFavoritesFolderTreeCollapsed",
Zeile 103:     "name": "NavigationPaneViewOption",
Zeile 113:     "name": "LastSurveyDate",
Zeile 123:     "name": "IsMailRootFolderTreeCollapsed",
Zeile 133:     "name": "NewEnabledPonts",
Zeile 143:     "name": "AllowedOnlineMeetingProviders",
Zeile 153:     "name": "EventsFromEmailShadowMailboxChecked",
Zeile 163:     "name": "FavoriteFolders",
Zeile 173:     "name": "LearnabilityTypesShown",
Zeile 183:     "name": "IsFocusedInboxEnabled",
Zeile 193:     "name": "InferredTimeZone",
Zeile 203:     "name": "EventsFromEmailDelegateChecked",
Zeile 213:     "name": "IsGroupsTreeCollapsed",
Zeile 223:     "name": "FrequentlyUsedFolders",
Zeile 233:     "name": "WeatherLocations",
Zeile 243:     "name": "BuildGreenLightSurveyLastShownDate",
Zeile 253:     "name": "DefaultOnlineMeetingProvider",
Zeile 263:     "name": "MailFolderPaneExpanded",
Zeile 273:     "name": "NavigationBarWidthRatio",
Zeile 283:     "name": "ClientTypeOptInState",
Zeile 293:     "name": "timezone",
Zeile 303:     "name": "IsFocusedInboxOnLastUpdateTime",

Das sind im Jul 2023 schon 30 Einstellungen, die über Substrate geliefert werden. Die gleiche Anfrage zu einem Outlook.com-Konto ist etwas kürzer

Zeile   3:     "name": "hybrid_rsvp_enabled",
Zeile   7:     "name": "onlinemeetings_enabledbydefault",
Zeile  10:     "name": "FrequentlyUsedFolders",
Zeile  20:     "name": "NewEnabledPonts",
Zeile  30:     "name": "DefaultOnlineMeetingProvider",
Zeile  40:     "name": "IsFocusedInboxOnLastUpdateTime",
Zeile  50:     "name": "timezone",
Zeile  60:     "name": "ClientTypeOptInState",
Zeile  70:     "name": "WeatherLocations",
Zeile  80:     "name": "FavoritesBitFlags",
Zeile  90:     "name": "AllowedOnlineMeetingProviders",
Zeile 100:     "name": "FavoriteNodes",
Zeile 110:     "name": "IsFavoritesFolderTreeCollapsed",
Zeile 120:     "name": "UserOptionsMigrationState",
Zeile 130:     "name": "translator_graph_migration_state",
Zeile 146:     "name": "microsoftedgeflight_autofill",

Die Einträge sind entweder direkt lesbar oder nur per BASE64 codiert und damit leicht decodierbar. Einige Einträge wie z.B. "FavoriteFolders" enthalten aber keine Ordnernamen sondern die GUID

API: Schreiben

Über die API kann ein Client auch Daten schreiben. Wenn ich im neuen Outlook 365 eine Outlook Signatur hinterlege, dann wird über einen "PATCH" diese neue Information in das Substrate geschrieben.

PATCH https://substrate.office.com/ows/beta/outlookcloudsettings/settings/account?fromows=true HTTP/1.1
Connection: Keep-Alive
Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJ0e....
User-Agent: Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.16529; Pro)
x-anchormailbox: PUID:<id>@<tenantGUID>
x-islargesetting: true
Content-Length: 456
Host: substrate.office.com

[
  {
    "name":"Outlook Web-Signatur",
    "itemClass":"",
    "id":"",
    "scope":"frank.carius@netatwork.de",
    "parentSetting":"roaming_signature_list",
    "secondaryKey":"txt",
    "type":"Blob",
    "timestamp":638237579064269207,"metadata":"",
    "value":"Mit freundlichen Grüßen\r\nUser1\r\n",
    "isFirstSync":"false",
    "source":"UserOverride"
  }
]

Über diesen Weg kann ein Client Daten hinterlegen und später auf dem gleichen oder einem anderen Endgerät wieder lesen.

Mit Blick auf die Signaturen ist die Story aber eher schlechter geworden. Nur das neue "Outlook 365" speichert seine Signaturen mittlerweile in der Cloud ab, aber die On-Premises-Versionen Outlook 2022, 2019 und älter haben diese Funktion nicht. Allerdings sind diese Signaturen aktuell (Jul 2023) auch nur für Outlook 365, denn Outlook on the Web (OWA) nutzt wieder eine anderen Speicherplatz, den ein Administrator auch über die Exchange PowerShell mit "Set-MailboxMessageConfiguration " lesen und setzen kann.

Noch viel Nebel

Manchmal frage ich mich schon, ob bei Microsoft die verschiedenen Teams miteinander sich abstimmen. Natürlich ist ein gemeinsame "Konfigurationsspeicher" nützlich und wenn alle Produkte diesen nutzen, kann in der Entwicklung auch Zeit gespart werden. Warum dazu aber eine neue zweite REST-API neben Graph herhalten muss, versteht wohl nur Microsoft. Zumal die Daten anscheinend auch im Exchange Postfach liegen. Die API ist sicher nicht neu, wenn schon im Jul 2023 bei mir 30 Einstellungen ausgeliefert werden. Ich hätte mir aber gewünscht, dass es zumindest in der Exchange Online PowerShell auch einen Befehle zum Lesen und Anpassen durch den Administrator gibt. Über Graph und mit AppPermissions wäre das sicher schnell möglich. Warum Microsoft hier aber einen weiteren Weg neben MAPI/HTTP und vor allem Microsoft Graph nutzt, erschließt sich mit nicht.

Weitere Links