IAMinerva
AccueilBlogA propos
m3Nouveautes M365coMicrosoft CopilotteMicrosoft TeamsshSharePoint & OneDriveinIntune & SecuriteexExchange & OutlookpoPower PlatformazAzure & Entra IDtuTutoriels & GuidesevEvenements & ConferencesseSecuritewiWindows
IAMinerva

Blog professionnel dedie a l'ecosysteme Microsoft 365.

Liens rapides

AccueilBlogA proposNewsletter

Restez informe

Recevez les dernieres actualites Microsoft 365 directement dans votre boite mail.

© 2026 IAMinerva. Tous droits reserves.

Construit avecNext.js&Tailwind
Script PowerShell avancé : Rapport de modifications Microsoft 365 Groups
BlogNouveautes M365Script PowerShell avancé : Rapport de modifications Microsoft 365 Groups
Nouveautes M365#Microsoft365Groups#PowerShell#MicrosoftGraph

Script PowerShell avancé : Rapport de modifications Microsoft 365 Groups

Guide technique complet pour créer un script PowerShell moderne de reporting des modifications Microsoft 365 Groups via Graph API et logs d'audit.

Houssem MAKHLOUF
9 avril 2026
7 min de lecture

TL;DR par Minerva

généré par IA

Guide technique complet pour créer un script PowerShell moderne de reporting des modifications Microsoft 365 Groups via Graph API et logs d'audit.

Introduction

La surveillance des modifications apportées aux Microsoft 365 Groups constitue un enjeu critique pour les administrateurs système. Les scripts PowerShell développés il y a plusieurs années nécessitent une modernisation complète pour s'adapter aux évolutions architecturales de l'écosystème Microsoft 365. Cet article présente une approche technique avancée pour implémenter un système de reporting automatisé des changements de groupes.

!

Obsolescence des anciens scripts

Les scripts PowerShell datant de 2016 utilisent des méthodes d'authentification dépréciées comme le paramètre Credential pour Exchange Online PowerShell, qui sera supprimé en juillet 2026.

Architecture technique du système de reporting

L'approche moderne repose sur l'exploitation des logs d'audit unifiés plutôt que sur le maintien de fichiers XML locaux. Cette architecture présente plusieurs avantages techniques :

  • Élimination des dépendances locales : Plus besoin de maintenir des fichiers de configuration sur disque
  • Source de vérité centralisée : Les événements d'audit fournissent un historique complet
  • Scalabilité améliorée : Compatible avec les environnements Azure Automation
  • Sécurité renforcée : Authentification moderne via Microsoft Graph

Composants techniques requis

Le système s'appuie sur plusieurs modules PowerShell critiques :

⚡PowerShell
1# Modules requis pour l'implémentation
2Import-Module Microsoft.Graph.Authentication
3Import-Module Microsoft.Graph.Groups
4Import-Module ExchangeOnlineManagement
5Import-Module ImportExcel # Optionnel pour l'export XLSX

Implémentation du script de reporting avancé

1

Établissement des connexions sécurisées

La première étape consiste à établir les connexions authentifiées vers les APIs Microsoft :

⚡PowerShell
1# Connexion à Exchange Online avec authentification moderne
2Connect-ExchangeOnline -UseRPCEncryption
3
4# Connexion à Microsoft Graph avec permissions spécifiques
5Connect-MgGraph -Scopes "Group.Read.All", "AuditLog.Read.All", "Mail.Send"
2

Récupération des Microsoft 365 Groups

Utilisation de Microsoft Graph pour obtenir la liste complète des groupes :

⚡PowerShell
1# Récupération optimisée des Microsoft 365 Groups
2$M365Groups = Get-MgGroup -Filter "groupTypes/any(c:c eq 'Unified')" -All
3
4# Création d'une table de hachage pour optimiser les recherches
5$GroupsHashTable = @{}
6foreach ($Group in $M365Groups) {
7 $GroupsHashTable[$Group.Id] = @{
8 DisplayName = $Group.DisplayName
9 Mail = $Group.Mail
10 CreatedDateTime = $Group.CreatedDateTime
11 Visibility = $Group.Visibility
12 }
13}
3

Interrogation des logs d'audit unifiés

Recherche des événements d'audit pour les 30 derniers jours :

⚡PowerShell
1# Définition de la période d'audit
2$StartDate = (Get-Date).AddDays(-30)
3$EndDate = Get-Date
4
5# Recherche des événements de modification de groupes
6$AuditSearchResults = Search-UnifiedAuditLog `
7 -StartDate $StartDate `
8 -EndDate $EndDate `
9 -Operations "Add group", "Update group", "Delete group" `
10 -ResultSize 5000
11
12# Filtrage pour les Microsoft 365 Groups uniquement
13$GroupAuditEvents = $AuditSearchResults | Where-Object {
14 $_.AuditData | ConvertFrom-Json | Where-Object {
15 $_.ModifiedProperties -contains "GroupType" -and
16 $_.ModifiedProperties.NewValue -contains "Unified"
17 }
18}
4

Traitement et analyse des données d'audit

Analyse approfondie des événements collectés :

⚡PowerShell
1# Initialisation des collections de résultats
2$NewGroups = [System.Collections.Generic.List[PSObject]]::new()
3$UpdatedGroups = [System.Collections.Generic.List[PSObject]]::new()
4$DeletedGroups = [System.Collections.Generic.List[PSObject]]::new()
5
6# Traitement des événements d'audit
7foreach ($Event in $GroupAuditEvents) {
8 $AuditData = $Event.AuditData | ConvertFrom-Json
9
10 switch ($Event.Operations) {
11 "Add group" {
12 $NewGroups.Add([PSCustomObject]@{
13 GroupName = $AuditData.ObjectId
14 CreatedBy = $AuditData.UserId
15 CreationTime = $Event.CreationDate
16 ClientApplication = $AuditData.ClientApplication
17 })
18 }
19 "Update group" {
20 $UpdatedGroups.Add([PSCustomObject]@{
21 GroupName = $AuditData.ObjectId
22 ModifiedBy = $AuditData.UserId
23 ModificationTime = $Event.CreationDate
24 ModifiedProperties = $AuditData.ModifiedProperties
25 })
26 }
27 "Delete group" {
28 $DeletedGroups.Add([PSCustomObject]@{
29 GroupName = $AuditData.ObjectId
30 DeletedBy = $AuditData.UserId
31 DeletionTime = $Event.CreationDate
32 })
33 }
34 }
35}
5

Génération du rapport HTML avancé

Création d'un rapport HTML avec mise en forme professionnelle :

⚡PowerShell
1# Template HTML avec CSS intégré
2$HTMLTemplate = @"
3<!DOCTYPE html>
4<html>
5<head>
6 <title>Rapport de modifications Microsoft 365 Groups</title>
7 <style>
8 body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
9 .header { background-color: #0078d4; color: white; padding: 20px; }
10 .section { margin: 20px 0; }
11 table { border-collapse: collapse; width: 100%; }
12 th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
13 th { background-color: #f2f2f2; }
14 .new { background-color: #d4edda; }
15 .updated { background-color: #fff3cd; }
16 .deleted { background-color: #f8d7da; }
17 </style>
18</head>
19<body>
20 <div class="header">
21 <h1>Rapport de modifications Microsoft 365 Groups</h1>
22 <p>Période : {0} à {1}</p>
23 </div>
24"@ -f $StartDate.ToString("yyyy-MM-dd"), $EndDate.ToString("yyyy-MM-dd")
25
26# Ajout des sections de données
27$HTMLReport = $HTMLTemplate
28$HTMLReport += "<div class='section new'><h2>Nouveaux groupes ({0})</h2>" -f $NewGroups.Count
29# [Code de génération des tableaux HTML...]
30$HTMLReport += "</body></html>"
6

Export des données et envoi automatisé

Finalisation avec export et envoi par email :

⚡PowerShell
1# Export vers Excel si le module ImportExcel est disponible
2if (Get-Module -ListAvailable -Name ImportExcel) {
3 $ExportPath = "C:\Reports\M365Groups_$(Get-Date -Format 'yyyyMMdd').xlsx"
4 $NewGroups | Export-Excel -Path $ExportPath -WorksheetName "Nouveaux" -AutoSize
5 $UpdatedGroups | Export-Excel -Path $ExportPath -WorksheetName "Modifiés" -AutoSize -Append
6 $DeletedGroups | Export-Excel -Path $ExportPath -WorksheetName "Supprimés" -AutoSize -Append
7} else {
8 # Fallback vers CSV
9 $ExportPath = "C:\Reports\M365Groups_$(Get-Date -Format 'yyyyMMdd').csv"
10 $AllChanges | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8
11}
12
13# Envoi du rapport par email via Microsoft Graph
14$Message = @{
15 Subject = "Rapport de modifications Microsoft 365 Groups - $(Get-Date -Format 'dd/MM/yyyy')"
16 Body = @{
17 ContentType = "HTML"
18 Content = $HTMLReport
19 }
20 ToRecipients = @(
21 @{
22 EmailAddress = @{
23 Address = "admin@contoso.com"
24 }
25 }
26 )
27 Attachments = @(
28 @{
29 "@odata.type" = "#microsoft.graph.fileAttachment"
30 Name = Split-Path $ExportPath -Leaf
31 ContentBytes = [Convert]::ToBase64String([IO.File]::ReadAllBytes($ExportPath))
32 }
33 )
34}
35
36Send-MgUserMail -UserId "service@contoso.com" -Message $Message

Optimisations et considérations de performance

✦

Optimisation des requêtes Graph

Pour les environnements avec de nombreux groupes, implémentez la pagination et utilisez les filtres OData pour réduire la charge réseau.

Limitations de l'API Delta Query

Bien que Microsoft Graph propose une fonctionnalité Delta Query pour les groupes, celle-ci présente des limitations importantes :

  • Le SDK PowerShell ne expose pas le delta link nécessaire
  • Nécessite l'établissement préalable d'une baseline
  • Complexité d'implémentation pour un gain marginal
⚡PowerShell
1# Exemple de requête Delta (limitée)
2# Note: Nécessite une implémentation REST directe
3$DeltaUri = "https://graph.microsoft.com/v1.0/groups/delta"

Intégration avec Azure Automation

Le script peut être facilement adapté pour Azure Automation avec les modifications suivantes :

Configuration des identités managées

⚡PowerShell
1# Authentification via identité managée
2Connect-MgGraph -Identity
3
4# Récupération des paramètres depuis Azure Key Vault
5$RecipientEmail = Get-AzKeyVaultSecret -VaultName "MyKeyVault" -Name "ReportRecipient" -AsPlainText

Programmation des exécutions

Création d'un Runbook planifié pour exécution automatique :

  • Fréquence recommandée : Hebdomadaire ou mensuelle
  • Fenêtre d'exécution : Heures creuses pour optimiser les performances
  • Gestion des erreurs : Implémentation de retry logic et alertes
MéthodeAvantagesInconvénients
Script localContrôle total, debugging facileMaintenance manuelle, dépendances locales
Azure AutomationExécution automatisée, identités managéesComplexité de configuration, coûts Azure
Azure FunctionsServerless, scaling automatiqueLimitations de runtime, courbe d'apprentissage

Analyse des patterns de modifications

L'analyse des données révèle des patterns intéressants :

  • Modifications système : Majoritairement via Office 365 Exchange Online app
  • Applications automatisées : Group Configuration Processor, Microsoft Approval Management
  • Actions utilisateurs : Généralement via Teams ou SharePoint Online
i

Insight technique

Les modifications automatiques représentent environ 70% des événements d'audit, reflétant les processus de synchronisation interne de Microsoft 365.

Sécurité et conformité

Permissions minimales requises

Le principe de moindre privilège doit être appliqué :

⚡PowerShell
1# Permissions Microsoft Graph strictement nécessaires
2$RequiredScopes = @(
3 "Group.Read.All", # Lecture des groupes
4 "AuditLog.Read.All", # Accès aux logs d'audit
5 "Mail.Send" # Envoi d'emails
6)

Gestion des données sensibles

  • Chiffrement des exports : Utilisation d'Azure Information Protection
  • Rétention des logs : Respect des politiques de gouvernance
  • Accès aux rapports : Contrôle RBAC strict

Conclusion technique

Cette approche modernisée pour le reporting des modifications Microsoft 365 Groups offre une solution robuste et scalable. L'utilisation des APIs Graph et des logs d'audit unifié garantit une précision et une fiabilité supérieures aux méthodes basées sur des fichiers de configuration locaux.

Le script peut être téléchargé depuis le repository GitHub Office 365 for IT Pros et adapté selon les besoins spécifiques de votre environnement.

Partager:
HM

Houssem MAKHLOUF

Microsoft 365 enthusiast & IT professional.

Article précédent

Agent 365 : Premiers API disponibles sur Microsoft Graph

7 avr. 2026
Article suivant

Microsoft Tenant Governance : Introduction et configurations

9 avr. 2026

Articles similaires

Exécution de scripts PowerShell pour auditer des applications AI et gérer leurs enregistrements.copilot

Auditer et Gérer les Applications AI avec PowerShell

Auditez les applications AI non autorisées dans Entra ID avec PowerShell et Microsoft Graph pour renforcer contrôle et sécurité.

28 juin 20265 min
Graphiques abstraits et géométriques avec des couches de couleurs translucides.exchange

Convertir les IDs Exchange pour l'API Graph Microsoft 365

Convertissez les identifiants Exchange (storeId, entryId, RestId) pour l'API Graph et l'eDiscovery ciblée. Guide technique avec scripts PowerShell complets.

28 juin 20268 min
Pyramide réfléchissante au centre de réseaux de fils dorés et cercles.azure

Graph Delta Queries pour les groupes Entra ID

Apprenez à utiliser Graph Delta Queries pour les groupes Entra ID pour suivre les modifications en temps réel. Tutoriels et scripts inclus.

27 juin 20264 min