Important
Depuis août 2023, le produit « Azure Active Directory » a été remplacé par « Microsoft Entra ID ». Toutes les licences et fonctionnalités restent inchangées.
En savoir plus
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.
L’accès aux propriétés utilisées dans le script suivant est conditionné à Azure AD Premium P1 et supérieur.




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.
Maintenant que l’application Azure Active Directory est crée, il faut lui accorder les permissions nécessaires à l’export des informations souhaitées.



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

Vous pouvez copier-coller directement le script ci-dessous dans votre éditeur PowerShell. Il vous permettra de :
## 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' = 'applicationjson'
'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:TempLastLoginDateReport.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 :
$Result | Where-Object { ($_.LastSignInDateTime -gt (get-date).AddDays(-90)) -and ($_.ISLicensed -eq $true) }
$Result | Where-Object { ($_.LastSignInDateTime -gt (get-date).AddDays(-180)) -and ($_.ISGuestUser -eq $true) }
$Result | Where UserprincipalName -match « contoso.com »
Il ne reste qu’à exporter en CSV !
$Result | Export-CSV « C:TempLastLoginDateReport.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 !
Microsoft a récemment publié la cinquième édition de sa revue Cyber Signals, qui met en lumière les menaces de sécurité informatiques qui pèsent sur les grands événements sportifs. Ce rapport s’appuie sur la télémétrie et les enseignements tirés suite au soutien apporté par Microsoft en matière de cybersécurité pendant la Coupe du monde de la FIFA 2022 au Quatar.
Lire la suite
Important L’année 2021 a vu l’arrêt progressif de notre service de messagerie Exchange 2016 hébergé par Openhost. Nous vous proposons de migrer vos messageries (ou celles de vos clients) sur Exchange Online, également connu sous le nom d’Office 365. En savoir plus Pour bon nombre d’entre nous, la messagerie électronique est certainement l’outil de travail […]
Lire la suite
Microsoft a officiellement annoncé la retraite des séries de machines virtuelles Azure F, Fs, Fsv2, Lsv2, G, Gs, Av2, Amv2 et B, prévue pour le 15 novembre 2028. À partir de cette date, ces VM ne pourront plus être créées ni utilisées. Il s’agit d’une évolution majeure dans la stratégie d’optimisation de l’offre Azure, visant à moderniser le portefeuille d’instances et […]
Lire la suite