Si vous travaillez sur un environnement Active Directory depuis plusieurs années, il y a de fortes chances que vous vous soyez déjà demandé comment récupérer la date de dernière connexion de vos utilisateurs. Si vous avez tenté de faire un export au format CSV avec la commande suivante et que cela n’a pas abouti, alors vous êtes au bon endroit :
Get-ADUser -Properties lastlogondate -Filter * | Export-csv
Dans un environnement Cloud Microsoft 365, il s’agit d’une information plus complexe à exporter. Aujourd’hui nous faisons le point sur la méthode à utiliser pour l’obtenir.
Objectif : créer une application Azure AD qui va exécuter un code Powershell.
Prérequis
L’accès aux propriétés utilisées dans le script suivant est conditionné à Azure AD Premium P1 et supérieur.
Créer une application Azure Active Directory
- Étape 1 : Ouvrir le portail Azure
- Étape 2 : Dans le menu d’administration Azure AD, cliquer sur « Enregistrement d’applications » (« App registrations »)
- Étape 3 : Cliquer sur « Nouvel enregistrement » (« New registration »)

- Étape 4 : Donner un nom à l’application et cliquer sur « Enregistrer » (« Register »)

- Étape 5 : Une fois l’application créée, prenez note de son ID (que vous pourrez retrouver à tout moment sur la page principale de l’application dans le menu « Vue d’ensemble » (« Overview »). Cet identifiant jouera le rôle du login pour identifier l’application.

- Étape 6 : Cliquer sur « Certificats & secrets » (« Certificates & secrets ») puis sur « Nouveau secret » (« New client secrets »)

- Étape 7 : Récupérer la valeur du secret. Il jouera le rôle du mot de passe.
Attention, veillez à bien conserver le secret car il ne sera pas récupérable ensuite. Si vous le perdez, pas d’inquiétude, il vous suffira d’en créer un nouveau.
Ajouter les permissions nécessaires
Maintenant que l’application Azure Active Directory est crée, il faut lui accorder les permissions nécessaires à l’export des informations souhaitées.
- Étape 1 : Cliquer sur « Permissions API » (« API permissions »)
- Étape 2 : Cliquer sur « Ajouter une permission » (« Add a permission »)

- Étape 3 : Choisir « Permissions d’application » (« Application permissions »)
- Étape 4 : Donner les permissions User.Read.All et AuditLog.Read.All

- Étape 5 : Donner le consentement administateur

Le consentement est donné lorsque le statuts est en vert.

Éditer un script PowerShell
Vous pouvez copier-coller directement le script ci-dessous dans votre éditeur PowerShell. Il vous permettra de :
- Récupérer un jeton d’accès (« access token »)
- Récupérer les informations souhaitées
- Faire un export CSV
## Define context variables here
$TenantID = "<Insert TenantID here>"
$ApplicationID = "<Insert application ID here>"
$ApplicationSecret = "<Insert application secret here>"
## Acquire Access Token using defined variables
$AccessTokenRequest = @{
URI = "https://login.microsoftonline.com/${TenantID}/oauth2/v2.0/token"
Body = @{
'scope' = "https://graph.microsoft.com/.default"
'client_id' = $ApplicationID
'client_secret' = $ApplicationSecret
'grant_type' = 'client_credentials'
}
}
$AccessToken = (Invoke-RestMethod -Method 'POST' @AccessTokenRequest).access_token
## Form request headers with the acquired $AccessToken
$Headers = @{
'Content-Type' = 'application\json'
'Authorization' = "Bearer ${AccessToken}"
}
## Define API Url
$ApiUrl = "https://graph.microsoft.com/beta/users `$select=displayName,userPrincipalName,signInActivity,userType,assignedLicenses"
$Result = @()
## Perform pagination if next page link is returned (odata.nextlink).
While ($Null -ne $ApiUrl) {
$Response = Invoke-RestMethod -Headers $Headers -Method 'GET' -Uri $ApiUrl
If ($Response.value) {
$Users = $Response.value
ForEach($User in $Users) {
$Result += New-Object PSObject -Property $(
[Ordered]@{
'DisplayName' = $User.displayName
'UserPrincipalName' = $User.userPrincipalName
'LastSignInDateTime' = If ($User.signInActivity.lastSignInDateTime) { [DateTime]$User.signInActivity.lastSignInDateTime } Else { $Null }
'LastNonInteractiveSignInDateTime' = If ($User.signInActivity.lastNonInteractiveSignInDateTime) { [DateTime]$User.signInActivity.lastNonInteractiveSignInDateTime } Else { $Null }
'IsLicensed' = If ($User.assignedLicenses.Count -ne 0) { $True } Else { $False }
'IsGuestUser' = If ($User.userType -eq 'Guest') { $True } else { $False }
}
)
}
}
$ApiUrl = $Response.'@odata.nextlink'
}
$Result | Export-CSV "C:\Temp\LastLoginDateReport.CSV" -Encoding 'Unicode' -Delimiter ';' -NoTypeInformation
Tout d’abord, vous devez déclarer les différentes variables récupérées sur l’application Azure Active Directory et sur le portail Azure ($TenantID, $ApplicationID, $ApplicationSecret).

Grâce à ces variables, nous pouvons authentifier l’application Azure AD et récupérer un jeton d’accès (« Access Token« ) qui sera utilisé dans les différences requêtes.

Ensuite, nous allons déclarer les variables qui composent les $Headers de la requête REST et l’URL de l’API Graph ($ApiURL). Attention, n’oubliez pas d’initialiser la variable $Resultat en Array.

Il ne vous reste plus qu’à exécuter le code. Les résultats sont stockés dans la variable $Result. Sur un grand nombre d’utilisateur, la requête peut prendre plusieurs minutes.

Vous avez la possibilité personnaliser votre export CSV grâce à la commande Where-Object :
- Récupérer les utilisateurs qui disposent d’une licence et qui ne se sont pas connectés depuis plus de 90 jours :
$Result | Where-Object { ($_.LastSignInDateTime -gt (get-date).AddDays(-90)) -and ($_.ISLicensed -eq $true) }
- Récupérer les utilisateurs invités qui ne se sont pas connectés depuis 180 jours :
$Result | Where-Object { ($_.LastSignInDateTime -gt (get-date).AddDays(-180)) -and ($_.ISGuestUser -eq $true) }
- Récupérer les utilisateurs avec un UPN en contoso.com :
$Result | Where UserprincipalName -match « contoso.com »
Il ne reste qu’à exporter en CSV !
$Result | Export-CSV « C:\Temp\LastLoginDateReport.CSV » -Encoding ‘Unicode’ -Delimiter ‘;’ -NoTypeInformation
Si vous n’êtes pas à l’aise avec l’idée de personnaliser votre export sur PowerShell, vous pouvez tout à fait l’exporter en CSV (sans utiliser la commande Where-Object) et filtrer les résultats directement dans Excel.
Et comme d’accoutumé, vous pouvez nous contacter pour solliciter un avis ou une prestation de nos experts. Nous possédons énormément de script que nous pouvons déployer sur votre tenant Azure/Office 365… profitez-en !

Marketeuse passionnée chez Openhost !
Tombée dans la marmite du marketing, je mets aujourd’hui mes compétences à disposition pour développer la visibilité d’Openhost sur internet.
Articles similaires :
Azure AD Connect synchronise votre annuaire local (Active Directory On Premise) avec le cloud Azure et améliore la productivité de vos utilisateurs en leur fournissant un identifiant unique pour se connecter et accéder aux ressources du Cloud Microsoft ainsi qu’aux ressources locales de votre entreprise [...]
La configuration d'un Active Directory est souvent le fruit d’un travail de plusieurs années par le service informatique. Sa reproduction égale ou supérieure en version Cloud (politiques de configuration, politique de sécurité, déploiement automatisé des applications...) représente donc un projet conséquent pour votre entreprise qui doit être réalisé en plusieurs…
Azure Active Directory Domain Services (AADDS) vous permet d’exécuter dans le Cloud des applications existantes qui ne peuvent pas utiliser les méthodes d’identification modernes, ou pour lesquelles vous ne souhaitez pas que l’authentification se base sur un annuaire local. Vous utilisez des services de domaines managés [...]