Exchange Online : 10 commandes PowerShell pour diagnostiquer les courriels

Suivez un message avec Message Trace V2, vérifiez connecteurs, règles, quotas et SMTP AUTH, puis validez une correction avec une portée pilote.

01

Partir du message et de son chemin

« Le courriel n’arrive pas » peut désigner un refus avant Exchange Online, une règle de transport, une boîte pleine, une quarantaine ou un échec du serveur destinataire. Ces dix commandes aident à trouver l’étape concernée et à préparer une correction précise.

Relevez direction entrant/sortant, adresses exactes, heure et fuseau, Message-ID complet, NDR et code SMTP. Conservez les en-têtes du message original. Les exemples contoso.com et example.com sont fictifs; les commandes lisent la configuration ou les traces et n’envoient pas de message.

Ce guide complète les articles DMARC et courriels indésirables : il se concentre sur le trajet, les connecteurs et les restrictions. Il ne remplace pas une investigation complète du flux ou un audit de sécurité.

02

Préparer la session et les permissions

Utilisez un module ExchangeOnlineManagement pris en charge qui expose les deux cmdlets V2. Vérifiez leur présence après connexion. Les notes de version Microsoft et la matrice de prérequis doivent guider les mises à jour; les versions 3.5.0 à 3.9.2 sous PowerShell 7 nécessitent PowerShell 7.4.x. Préparez et validez la combinaison dans votre poste d’administration avant l’incident.

Utilisez une connexion interactive avec MFA et une identité nominative. Message Trace relève du RBAC Exchange : faites déléguer le rôle Message Tracking avec les entrées V2 disponibles dans votre locataire. Pour les autres commandes, faites déterminer les entrées Get et les paramètres nécessaires avec la procédure Microsoft, puis appliquez la portée de destinataires utile. N’accordez pas Global Administrator pour lancer ces diagnostics.

Un rôle de lecture des destinataires ou de la configuration n’autorise pas forcément les traces. Une commande absente ou un accès refusé doit être documenté comme non évalué. Exchange Online et les fonctionnalités de boîte doivent être couverts par les licences appropriées; ce guide n’exige pas à lui seul Defender for Office 365 Plan 2. Les recherches et remédiations Defender supplémentaires peuvent avoir leurs propres prérequis.

Préparation — hors décompte
# Preparation and connection, outside the 10 diagnostic commands.
$ErrorActionPreference = 'Stop'
Get-Module -ListAvailable ExchangeOnlineManagement | Select-Object Name,Version
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -UserPrincipalName admin@contoso.com
Get-Command Get-MessageTraceV2,Get-MessageTraceDetailV2 -ErrorAction Stop
# Use DateTime values to avoid ambiguous regional date strings.
$end = [datetime]::UtcNow
$start = $end.AddHours(-2)
03

Lire les limites de Message Trace V2

Les traces V2 permettent une recherche sur les 90 derniers jours, avec au plus dix jours par requête. Get-MessageTraceV2 retourne 1 000 résultats par défaut, 5 000 au maximum. Atteindre le plafond impose de réduire la fenêtre ou de suivre la continuation documentée avec EndDate et StartingRecipientAddress; n’utilisez pas les anciens paramètres Page/PageSize.

Les horodatages de sortie sont en UTC. Les exemples construisent explicitement des DateTime UTC. Le service limite les requêtes; ne lancez pas une boucle de détails sur tout le locataire. Une trace n’est pas un journal de lecture utilisateur.

04

1. Retrouver le message avec Get-MessageTraceV2

Commencez par une fenêtre de deux heures et les adresses exactes. Les résultats sont par destinataire. Conservez le Message-ID original, distinct de MessageTraceId. Une absence de résultat peut provenir du délai d’ingestion, de la fenêtre, d’un alias ou d’un message qui n’a jamais atteint le service.

Lecture seule
$trace = @(Get-MessageTraceV2 -SenderAddress 'alex@contoso.com' -RecipientAddress 'sam@example.com' -StartDate $start -EndDate $end -ResultSize 5000 -ErrorAction Stop)
$trace | Select-Object Received,SenderAddress,RecipientAddress,Subject,Status,MessageTraceId,MessageId
05

2. Lire les événements avec Get-MessageTraceDetailV2

Suivez les événements et le code d’échec. Delivered n’est pas un accusé de lecture : pour un destinataire externe, confirmez la remise et l’interprétation avec le système distant; pour une boîte interne, examinez aussi règles, indésirables et quarantaine. Conservez l’objet complet si le détail affiché est insuffisant.

Lecture seule
# Replace with the exact trace ID AND recipient from check 1.
Get-MessageTraceDetailV2 -MessageTraceId '11111111-1111-1111-1111-111111111111' -RecipientAddress 'sam@example.com' -StartDate $start -EndDate $end -ErrorAction Stop |
  Select-Object Date,Event,Detail,Data
06

3. Vérifier le type et les adresses du destinataire

Une boîte, un contact, un MailUser et un groupe n’ont pas le même chemin de remise. Vérifiez alias et cible externe, particulièrement en hybride. L’adresse primaire doit être connue; pour chercher un alias, utilisez une recherche ciblée appropriée. Une erreur d’accès ne prouve pas l’absence du destinataire.

Lecture seule
Get-EXORecipient -PrimarySmtpAddress 'alex@contoso.com' -Properties EmailAddresses,ExternalEmailAddress -ErrorAction Stop |
  Select-Object DisplayName,RecipientTypeDetails,PrimarySmtpAddress,EmailAddresses,ExternalEmailAddress
07

4. Lire les restrictions et quotas d’une boîte

Comparez le NDR aux limites réelles. Une exigence d’expéditeur authentifié peut expliquer un refus externe; une liste d’autorisation ou une modération mérite aussi examen. Ce contrôle vise une boîte : utilisez les cmdlets du type approprié pour un groupe. Une limite Unlimited peut laisser d’autres limites du service s’appliquer.

Lecture seule
Get-Mailbox -Identity 'alex@contoso.com' -ErrorAction Stop |
  Select-Object PrimarySmtpAddress,MaxSendSize,MaxReceiveSize,IssueWarningQuota,ProhibitSendQuota,ProhibitSendReceiveQuota,RequireSenderAuthenticationEnabled,AcceptMessagesOnlyFromSendersOrMembers,RejectMessagesFromSendersOrMembers,ModerationEnabled
08

5. Comparer taille et quota de la boîte

Comparez la taille aux quotas du contrôle 4 sans comparer naïvement des chaînes de texte. La boîte principale, l’archive et Recoverable Items ont des limites distinctes. Une taille élevée est un indice, pas une explication suffisante sans événement ou NDR correspondant. N’effacez pas des messages pour faire un test.

Lecture seule
Get-EXOMailboxStatistics -Identity 'alex@contoso.com' -ErrorAction Stop |
  Select-Object DisplayName,ItemCount,TotalItemSize,TotalDeletedItemSize
09

6. Inspecter les connecteurs entrants

Comparez la configuration à l’IP publique réellement présentée et au certificat du serveur émetteur. Un changement de NAT ou de certificat peut casser un relais. Ne remplacez pas une portée précise par « toutes les IP » pour rétablir le flux. Une configuration correcte ne prouve pas que le connecteur a traité ce message.

Lecture seule
Get-InboundConnector -ErrorAction Stop |
  Select-Object Identity,Name,Enabled,ConnectorType,SenderDomains,SenderIPAddresses,RequireTls,TlsSenderCertificateName,RestrictDomainsToIPAddresses,RestrictDomainsToCertificate
10

7. Inspecter les connecteurs sortants

Contrôlez destination, smart host et TLS, puis corrélez la sélection avec les règles de transport. En routage centralisé hybride, le problème peut être après Exchange Online. Un Get ne valide ni le certificat distant ni la connectivité; utilisez la validation de connecteur prévue dans l’EAC et un message test autorisé.

Lecture seule
Get-OutboundConnector -ErrorAction Stop |
  Select-Object Identity,Name,Enabled,ConnectorType,RecipientDomains,SmartHosts,UseMXRecord,TlsSettings,TlsDomain,RouteAllMessagesViaOnPremises,IsTransportRuleScoped
11

8. Lire l’ordre et les actions des règles de transport

L’ordre, les exceptions et StopRuleProcessing peuvent expliquer une différence entre deux destinataires. Lisez Description et le détail complet de la règle retenue. Ne désactivez pas toutes les règles : reproduisez avec un message fictif et une portée pilote. Une règle présente peut être désactivée ou en mode test.

Lecture seule
Get-TransportRule -ResultSize Unlimited -ErrorAction Stop |
  Sort-Object Priority |
  Select-Object Identity,Name,State,Mode,Priority,Description,StopRuleProcessing
12

9. Lire l’exception SMTP AUTH de la boîte

True désactive SMTP AUTH pour cette boîte; False l’active à ce niveau; Null hérite du paramètre organisationnel. D’autres contrôles peuvent encore bloquer la connexion. Cette lecture ne prouve ni l’utilisation de Basic Authentication ni celle d’OAuth. Identifiez d’abord si l’appareil utilise soumission authentifiée, relais ou envoi direct.

Lecture seule
Get-CASMailbox -Identity 'device-mail@contoso.com' -ErrorAction Stop |
  Select-Object PrimarySmtpAddress,SmtpClientAuthenticationDisabled
13

10. Lire le réglage SMTP AUTH de l’organisation

Croisez ce booléen avec le contrôle 9, les stratégies d’authentification, Security Defaults et les journaux Entra applicables. Ne réactivez pas Basic Authentication comme correction. Documentez la méthode OAuth ou le relais supporté de l’application, puis validez l’envoi interne et externe séparément.

Lecture seule
Get-TransportConfig -ErrorAction Stop |
  Select-Object SmtpClientAuthenticationDisabled
14

Relier les résultats à un diagnostic

Exemple fictif : une imprimante envoie à l’interne mais reçoit 5.7.64 pour l’externe après un changement de fournisseur Internet. Comparez l’IP publique actuelle à la portée du connecteur entrant et au NDR avant toute modification. Ce scénario oriente le diagnostic; il ne prouve pas que chaque erreur 5.7.64 a la même cause.

ConstatVérification suivanteConclusion à éviter
Aucune tracePériode, alias, NDR et journal de l’émetteurExchange a perdu le message
Échec avec code SMTPDétails par destinataire et restrictionsIl faut réessayer sans investigation
Delivered mais introuvableRègles de boîte, indésirables, quarantaine ou serveur distantL’utilisateur a lu le message
Relais appareil refuséChemin utilisé, IP publique et certificatIl faut ouvrir le relais à toutes les IP
SMTP AUTH bloquéParamètres effectifs et méthode d’authentificationIl faut réactiver Basic
15

Corriger sur une portée pilote et valider

Les dix commandes ne changent rien dans le locataire. Une modification de connecteur, règle, quota ou authentification doit avoir son propre plan : propriétaire, état initial exporté, justification, portée pilote, fenêtre et retour arrière. Ne supprimez pas une règle avant de préserver ses conditions, actions, exceptions et priorité.

Validez un message fictif dans chaque sens nécessaire : interne, entrant externe et sortant externe. Conservez le NDR éventuel, la nouvelle trace et le résultat chez le destinataire. L’envoi de test est une action distincte à autoriser selon votre procédure; ne transmettez pas de données réelles pour reproduire.

Après modification, relisez le réglage concerné et surveillez les flux légitimes. Le retour arrière restaure les valeurs précédentes documentées. Une modification DNS peut rester en cache selon le TTL; un retour à l’ancienne valeur n’est pas instantané partout.

Enregistrez compte collecteur, locataire, période UTC, versions et erreurs dans un dossier protégé avec rétention définie. Les traces peuvent contenir sujets, adresses et détails de routage sensibles. Fermez la session à la fin.

Un accompagnement Microsoft 365 peut corréler ces preuves avec l’hybride, les applications et les contrôles de sécurité, puis préparer une correction qui respecte les usages métier.

Fermeture — hors décompte
Disconnect-ExchangeOnline -Confirm:$false