Introduction : le labyrinthe des identifiants Exchange
Les administrateurs Exchange Online et les développeurs qui travaillent avec Microsoft Graph se heurtent régulièrement à un même obstacle : la multiplicité des formats d'identifiants de dossiers de boîtes aux lettres. Chaque composant de l'écosystème Exchange utilise sa propre représentation interne, et naviguer entre ces formats sans documentation claire relève souvent du défi.
Cet article examine concrètement les conversions nécessaires pour passer du storeId, retourné par les cmdlets PowerShell Exchange Online, jusqu'au RestId exploitable par les méthodes de l'API Microsoft Graph. Nous abordons également la conversion vers le format attendu par les recherches eDiscovery ciblées (targeted collections).
Périmètre de l'article
Les conversions décrites ici concernent exclusivement les identifiants de dossiers de boîtes aux lettres Exchange Online. Les étapes sont similaires pour les éléments (items), mais le cas d'usage principal reste ici la gestion des dossiers via PowerShell et l'API Graph.
Les différents types d'identifiants Exchange Online
Avant d'entrer dans le vif du sujet, il est utile de dresser un panorama des identifiants impliqués dans la chaîne de conversion :
- storeId : identifiant natif retourné par
Get-ExOMailboxFolderStatistics,Get-MailboxFolderStatisticsouGet-MailboxFolder. C'est le point de départ systématique pour un profil administrateur. - eDiscoveryId : format hexadécimal attendu par la fonctionnalité de targeted collection dans les recherches de contenu (Content Search / eDiscovery).
- entryId : identifiant utilisé par les clients MAPI. Sert d'intermédiaire obligatoire pour atteindre le RestId.
- RestId : identifiant consommé par les API Outlook/Graph (
/me/mailFolders/{id}). - OWAId : variante du RestId adaptée à la navigation directe dans Outlook Web App.
| Identifiant | Source | Usage principal |
|---|---|---|
| storeId | Get-ExOMailboxFolderStatistics | Point de départ PowerShell |
| eDiscoveryId | Conversion depuis storeId | Targeted collections eDiscovery |
| entryId | Conversion depuis storeId | Clients MAPI, intermédiaire Graph |
| RestId | API translateExchangeIds | Appels API Microsoft Graph |
| OWAId | Dérivé du RestId | Navigation directe dans OWA |
Étape 1 : récupérer le storeId via PowerShell
La première étape consiste à identifier le dossier cible et à récupérer son storeId via la propriété FolderId :
1Get-ExOMailboxFolderStatistics vasil | Where-Object { $_.Name -eq "Xbox" } | Select-Object Name, FolderIdRésultat attendu :
1Name FolderId2---- --------3Xbox LgAAAAChKSJAhlnUTIHtKSso30ThAQBIPfDMxyP/RYhY8M8xmAPVAAS8XYoAAAABCe storeId encodé en Base64 est la matière première de toutes les conversions suivantes.
Étape 2 : convertir le storeId en eDiscoveryId
La fonctionnalité de targeted collection dans Microsoft Purview eDiscovery permet de restreindre une recherche de contenu à un dossier précis via le mot-clé KQL folderId. Cette approche est particulièrement efficace lors d'investigations ciblées.
Targeted collections eDiscovery
La targeted collection permet de limiter une recherche eDiscovery à un dossier spécifique, y compris avec des exclusions. Le mot-clé KQL folderId attend un format hexadécimal spécifique, différent du storeId brut.
Voici le bloc PowerShell permettant cette conversion :
1$folderId = [Convert]::FromBase64String($folderId)2 3$encoding = [System.Text.Encoding]::GetEncoding("us-ascii")4$nibbler = $encoding.GetBytes("0123456789ABCDEF")5 6$indexIdBytes = New-Object byte[] 48; $indexIdIdx = 07$folderId | Select-Object -Skip 23 -First 24 | ForEach-Object {8 $indexIdBytes[$indexIdIdx++] = $nibbler[$_ -shr 4]9 $indexIdBytes[$indexIdIdx++] = $nibbler[$_ -band 0x0F]10}11 12return $encoding.GetString($indexIdBytes)Pour le dossier Xbox utilisé en exemple, la transformation produit :
1# storeId (Base64)2LgAAAAChKSJAhlnUTIHtKSso30ThAQBIPfDMxyP/RYhY8M8xmAPVAAS8XYoAAAAB3 4# eDiscoveryId (hexadécimal)5483DF0CCC723FF458858F0CF319803D50004BC5D8A000000Ce format hexadécimal peut désormais être utilisé directement dans une requête KQL ciblée sur ce dossier.

Étape 3 : convertir le storeId en entryId (intermédiaire MAPI)
L'API Graph expose la méthode translateExchangeIds pour convertir des identifiants Exchange vers d'autres formats. Cependant, elle ne prend pas en charge le storeId comme entrée directe. Il est donc nécessaire de passer d'abord par l'entryId, format MAPI intermédiaire.
Limitation de translateExchangeIds
La méthode translateExchangeIds de l'API Graph ne supporte pas le storeId en entrée directe. La conversion intermédiaire vers l'entryId est obligatoire. Par ailleurs, les identifiants immutableEntryId et restImmutableEntryId ne sont pas supportés pour les dossiers.
La fonction PowerShell suivante effectue la conversion storeId → entryId :
1function FolderIdToEntryId {2 3 param([Parameter(Mandatory=$true)]$folderId)4 5 # Décodage Base64 vers tableau d'octets6 $folderIdBytes = [Convert]::FromBase64String($folderId)7 8 # Conversion en chaîne hexadécimale, suppression des tirets, premier octet ignoré9 $folderIdHexString = [System.BitConverter]::ToString($folderIdBytes).Replace('-','')10 $folderIdHexStringLength = $folderIdHexString.Length11 12 # Suppression du premier et du dernier octet13 $entryIdHexString = $folderIdHexString.SubString(2, ($folderIdHexStringLength - 4))14 15 # Reconstruction du tableau d'octets (2 caractères = 1 octet)16 $entryIdBytes = [byte[]]::new($entryIdHexString.Length / 2)17 For ($i = 0; $i -lt $entryIdHexString.Length; $i += 2) {18 $entryIdTwoChars = $entryIdHexString.Substring($i, 2)19 $entryIdBytes[$i / 2] = [convert]::ToByte($entryIdTwoChars, 16)20 }21 22 # Encodage en Base64 URL-safe23 $entryIdBase64 = [Convert]::ToBase64String($entryIdBytes)24 $equalCharCount = $entryIdBase64.Length - $entryIdBase64.Replace('=','').Length25 $entryId = $entryIdBase64.TrimEnd('=').Replace('/','-').Replace('+','_') + $equalCharCount26 27 return $entryId28}Étape 4 : obtenir le RestId via translateExchangeIds
Une fois le entryId obtenu, il est possible d'appeler la méthode translateExchangeIds de Microsoft Graph pour obtenir le RestId. Ce dernier est l'identifiant attendu par toutes les opérations sur les dossiers via les API Graph (endpoints /me/mailFolders, /users/{id}/mailFolders, etc.).
Les dossiers système prédéfinis (Inbox, SentItems, RecoverableItemsDeletions, etc.) disposent de valeurs dites well-known qui peuvent être utilisées directement sans conversion. La conversion est nécessaire uniquement pour les dossiers créés par les utilisateurs.
Script complet : générer tous les identifiants d'une boîte aux lettres
En combinant les conversions décrites ci-dessus, il est possible de produire un inventaire complet des dossiers d'une boîte aux lettres avec l'ensemble de leurs identifiants.
Prérequis
- Module Exchange Online Management (pour
Get-ExOMailboxFolderStatistics) - Module Microsoft Graph SDK for PowerShell
- Permission déléguée :
User.ReadBasic.All(côté Graph) et droits Exchange appropriés
Paramètres du script
Le script expose les paramètres suivants :
-Mailbox(obligatoire) : adresse SMTP principale ou GUIDExternalDirectoryObjectIdde la boîte cible.-IncludeNonIPM(optionnel) : inclut les dossiers hors de l'arborescence IPM (non visibles par l'utilisateur).
Attention au paramètre -IncludeNonIPM
Les boîtes aux lettres Exchange Online contiennent potentiellement des milliers de dossiers système hors IPM. N'utilisez le paramètre -IncludeNonIPM qu'en connaissance de cause, car cela peut considérablement allonger la durée d'exécution et le volume de données produites.
Exemples d'utilisation
1# Exécution sur une boîte identifiée par son adresse SMTP2.\Mailbox_Folder_IDs.ps1 -Mailbox user@domain.com3 4# Exécution avec l'ExternalDirectoryObjectId (GUID)5.\Mailbox_Folder_IDs.ps1 -Mailbox 4ebd5057-4d61-4ca0-beb7-df3f1ebd1aa76 7# Inclure les dossiers hors de l'arborescence IPM8.\Mailbox_Folder_IDs.ps1 -Mailbox user@domain.com -IncludeNonIPMIdentifiant et bouton Open in OWA
Si vous prévoyez d'utiliser le bouton Open in OWA généré dans le rapport HTML, privilégiez l'adresse SMTP principale (UPN) comme valeur du paramètre -Mailbox. Ce bouton ne fonctionne pas correctement si un GUID ExternalDirectoryObjectId est fourni en entrée.
Traitement interne du script
Le script suit la séquence logique suivante :
Connexion et vérification des permissions
Une fonction de connectivité intégrée établit la session Exchange Online et Graph, puis vérifie la présence de la permission User.ReadBasic.All. Elle peut être remplacée par votre propre mécanisme d'authentification.
Récupération des dossiers de la boîte
Appel à Get-ExOMailboxFolderStatistics pour récupérer l'intégralité des dossiers. Le switch -IncludeNonIPM conditionne l'inclusion des dossiers système.
Calcul des identifiants eDiscoveryId et EntryId
Pour chaque dossier, le storeId est converti localement en eDiscoveryId et en entryId sans appel réseau supplémentaire.
Appel batch à translateExchangeIds
Les entryId générés sont soumis à la méthode translateExchangeIds de l'API Graph en lots de 1 000. Les RestId retournés sont stockés dans une table de hachage.
Export des résultats
Deux fichiers sont générés dans le répertoire courant : un fichier CSV et un fichier HTML avec tableau triable. Le rapport HTML inclut deux boutons par ligne : Open in Graph Explorer et Open in OWA.
Colonnes du rapport CSV
- Name : nom du dossier
- FolderType : type de dossier Exchange
- Identity : chemin complet du dossier dans la boîte
- FolderId : storeId (format Base64)
- eDiscoveryId : identifiant pour les targeted collections
- EntryId : identifiant MAPI
- RestId : identifiant pour l'API Microsoft Graph
- OWAId : identifiant pour la navigation OWA


Comportement des boutons dans le rapport HTML
- Open in Graph Explorer : fonctionne en mode délégué uniquement si la permission
Mail.ReadBasic.Sharedest accordée. - Open in OWA : fonctionne exclusivement pour les dossiers de messagerie accessibles aux utilisateurs (pas les dossiers Calendrier, Contacts ou système). Requiert l'adresse UPN/SMTP comme identifiant de boîte.
Considérations opérationnelles
L'utilisation de permissions applicatives (application permissions) n'est pas encore implémentée dans la version actuelle du script. Pour les environnements nécessitant une automatisation sans interaction utilisateur, une adaptation du bloc de connexion sera nécessaire.
D'un point de vue gestion des identités M365, ces conversions illustrent bien la complexité inhérente à la coexistence des couches MAPI, EWS (en cours de dépréciation) et Graph dans Exchange Online. La migration progressive vers les API Graph impose de maîtriser ces transformations pour maintenir la parité fonctionnelle des outils d'administration.
Dépréciation EWS
Avec la dépréciation annoncée d'Exchange Web Services (EWS), la maîtrise de la conversion vers les identifiants Graph (RestId) devient un prérequis incontournable pour la modernisation des scripts et outils d'administration Exchange Online.



