Comment consulter les journaux de connexion des utilisateurs dans Entra ID (Microsoft 365)

Cet article explique comment récupérer les informations de dernière connexion et l’historique des connexions des utilisateurs Azure AD. Parfois, un simple coup d’œil au portail Azure suffit : accédez à Portail Azure, puis Azure AD > Utilisateurs > sélectionnez un utilisateur > Journaux de connexion. Rapide et facile, cette méthode vous permet de consulter des informations telles que la dernière connexion, les détails de l’appareil, la localisation, l’agent utilisateur, etc. Vous pouvez même filtrer les données ou les exporter au format CSV. Toutefois, si vous devez analyser plusieurs utilisateurs ou générer des rapports sur une période plus longue, PowerShell est la solution idéale. Bien que plus complexe, cette méthode offre de nombreuses possibilités pour explorer l’historique des connexions au sein de votre locataire.

Comment obtenir l’historique de connexion des utilisateurs dans Azure AD à l’aide de l’API Microsoft Graph

Se connecter à l’API Microsoft Graph et obtenir les journaux

Une approche courante consiste à se connecter à l’API Microsoft Graph. C’est un peu inhabituel, mais cela permet d’automatiser la récupération des journaux de centaines, voire de milliers d’utilisateurs simultanément, bien plus que ne le permet le portail. L’essentiel est d’accorder à votre application les autorisations API appropriées : AuditLog. Read. All et Directory. Read. All. Sans ces autorisations, impossible de procéder.

Une fois les autorisations définies, vous pouvez commencer par exécuter quelques commandes PowerShell. Commencez par obtenir un jeton d’accès. Il ressemble généralement à ceci :

$ApplicationID = "your-application-id" $TenantDomainName = "your-tenant.onmicrosoft.com" $AccessSecret = "your-secret" $Body = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" client_Id = $ApplicationID Client_Secret = $AccessSecret } $ConnectGraph = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$TenantDomainName/oauth2/v2.0/token" -Method POST -Body $Body $token = $ConnectGraph.access_token

Oui, cette étape m’a permis de résoudre des erreurs d’authentification dues à l’absence de jetons. Une fois votre jeton obtenu, vous pouvez effectuer des requêtes comme :

$GraphSignInLogsUrl = "https://graph.microsoft.com/v1.0/auditLogs/signIns" $signIns = Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GraphSignInLogsUrl -Method Get $signIns.value

Il est important de noter que l’API Graph renvoie jusqu’à 1 000 objets simultanément. Pour obtenir une vue d’ensemble complète, il est donc nécessaire d’implémenter une pagination, généralement via un @odata.nextLinklien, puis de parcourir les entrées. Dans certaines configurations, cette opération peut s’avérer longue : l’API peut parfois sembler lente ou tronquer les données, notamment si votre instance compte de nombreux utilisateurs connectés.

Besoin de plus de contrôle ? Utilisez Azure Graph Explorer . Il est très pratique pour sélectionner des colonnes spécifiques comme les colonnes de données, userDisplayNameles colonnes de données, les colonnes de données, les colonnes de données, les colonnes de données et les colonnes de données. Vous pouvez ainsi personnaliser les rapports et n’afficher que les informations pertinentes.userPrincipalNameappDisplayNamelocationipAddressclientAppUseddeviceDetailcreatedDateTime

Voici un exemple de génération d’un rapport pour les 90 derniers jours — c’est un peu fastidieux, mais ça fonctionne :

$SetDate = (Get-Date).AddDays(-90) $SetDateFormatted = Get-Date $SetDate -format yyyy-MM-dd $signInLogs = Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri "https://graph.microsoft.com/v1.0/auditLogs/signIns" -Method Get $result = $signInLogs.value | Select-Object userDisplayName, userPrincipalName, appDisplayName, ipAddress, clientAppUsed, deviceDetail, location, createdDateTime | Where-Object {$_.createdDateTime -gt $SetDate} $allHistory = @() foreach ($entry in $result){ $userHistory = [PSCustomObject]@{ User = $entry.userDisplayName UPN = $entry.userPrincipalName App = $entry.appDisplayName IP = $entry.ipAddress Browser = $entry.clientAppUsed OS = $entry.deviceDetail. OperatingSystem Location = $entry.location.city + ", " + $entry.location.countryOrRegion Date = $entry.createdDateTime } $allHistory += $userHistory } $allHistory | Export-Csv "C:\Path\To\Your\Folder\AzureSignInLogs.csv" -NoTypeInformation 

Cela exporte un fichier CSV contenant de nombreuses informations : qui s’est connecté, d’où, avec quel appareil et quand. Vous pouvez ajouter d’autres champs si nécessaire. Pour connaître la dernière connexion de chaque utilisateur, exécutez simplement :

$allHistory | Group-Object UPN | ForEach-Object { $_. Group | Select UPN, Date -First 1 }

Pour identifier les utilisateurs inactifs, il suffit de récupérer la liste complète des UPN via l’API et de la comparer avec vos journaux de connexion. Vous repérerez ainsi plus facilement les personnes qui ne se sont pas connectées récemment et qui n’ont peut-être plus besoin de leur licence.

Méthode 2 : Utiliser le module AzureADPreview

Si vous préférez une approche plus directe, l’installation du AzureADPreviewmodule est utile. C’est un peu plus facile à gérer, surtout si vous êtes à l’aise avec PowerShell. Voici comment le configurer :

Install-Module AzureADPreview -AllowClobber Connect-AzureAD

Une fois la connexion établie, l’exécution de la commande « get sign-in logs » ressemble à ceci :

Get-AzureADAuditSignInLogs -Top 10 | select CreatedDateTime, UserPrincipalName, IsInteractive, AppDisplayName, IpAddress, TokenIssuerType, @{Name='DeviceOS'; Expression={$_. DeviceDetail. OperatingSystem}} | ft

Cette approche est pratique pour des vérifications rapides ou pour automatiser des tâches courantes, comme l’exportation des journaux récents au format CSV :

$SetDate = (Get-Date).AddDays(-3) $SetDateFormatted = Get-Date $SetDate -format yyyy-MM-dd Get-AzureADAuditSignInLogs -Filter "createdDateTime gt $SetDateFormatted" | Select-Object userDisplayName, userPrincipalName, appDisplayName, ipAddress, clientAppUsed, @{Name='DeviceOS'; Expression={$_. DeviceDetail. OperatingSystem}} | Export-Csv "C:\Path\To\Your\Folder\AzureSignInLogs.csv" -NoTypeInformation

En résumé, c’est une méthode très simple pour récupérer les connexions récentes. Seul bémol : vous êtes limité à 10 entrées de journal, mais vous pouvez ajuster ce nombre avec des filtres si nécessaire. Vous pouvez également récupérer des données à partir des journaux de sécurité de vos contrôleurs de domaine pour Active Directory local, mais nous aborderons ce sujet ultérieurement.

Au final, les deux méthodes offrent des options intéressantes, selon que vous préfériez la flexibilité de l’API Graph ou la simplicité des modules PowerShell comme AzureADPreview. Quelle que soit la méthode choisie pour votre flux de travail, elles vous permettent d’analyser l’activité des utilisateurs et de comprendre les habitudes de connexion, les sessions et les comptes potentiellement inactifs. Notez toutefois que ces scripts nécessitent parfois un ajustement, notamment pour les environnements plus importants ou si les autorisations ne sont pas optimales.