В этой статье мы покажем, как узнать время последнего входа пользователей в Azure AD, и сгенерировать другие отчеты об активности пользователей в вашем тенанте Microsoft с помощью PowerShell (через модуль AzureADPreview и Microsoft Graph API).
Самый простой способ посмотреть логи активности пользователя Azure – воспользоваться порталом. Перейдите на https://portal.azure.com -> Azure AD -> Users -> выберите пользователя -> Sign-in logs. В открывшейся таблице появится вся история по входам пользователя.
Можно узнать время входа, операционную систему на устройстве пользователя, местоположение, User agent и т.д. В таблице можно натсроить фильтры по разным параметрам, добавлять/удалять столбцы и выгрузить данные в CSV файл.
Однако, если вам нужно получить информацию по последнему входу для нескольких или всех пользователей, придется использовать PowerShell. Есть два способа получения доступа к журналам входа пользователей в Azure:
Получение истории аутентификации пользователей в Azure через Microsoft Graph API
Попробуем получить логи входа пользователей через Microsoft Graph API. Подключитесь к своему тенанту Azure через Microsoft Graph API (подробная инструкции по настройке доступа здесь):

$ApplicationID = "46692ad-f8a0-123f-8cca-432102de3bcf"
$TenatDomainName = "26216542-465a-407e-a17d-2bb4c3e3313b"
$AccessSecret = "d-8jM3ZUG87du-syZd32k01q.gkssa3mH3v"
$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/$TenatDomainName/oauth2/v2.0/token" -Method POST -Body $Body
$token = $ConnectGraph.access_token
После получения токена можно подключиться REST API, хранящей информацию о входах пользователей:
$GraphSignInLogs = "https://graph.microsoft.com/v1.0/auditLogs/signIns"
(Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GraphSignInLogs -Method Get).value
Проверьте, что вы можете получить данные о событиях аутентфикации пользователей в Azure:
@odata.nextLink
.Теперь с помощью Azure Graph Explorer (https://developer.microsoft.com/en-us/graph/graph-explorer) можно выбрать название полей, которые вы хотите видеть в отчете об истории входа пользователей. Например, я хочу видеть в отчете информацию о пользователе, операционной системе, приложении Azure/Microsoft 365 которое использовал пользователь и его местоположение (поля userDisplayName, userPrincipalName, appDisplayName, location, ipAddress, clientAppUsed, deviceDetail, createdDateTime).
В этом примере я хочу получить отчет по активности пользователей Azure за последние 90 дней:
$SetDate = (Get-Date).AddDays(-90)
$SetDate = Get-Date($SetDate) -format yyyy-MM-dd
$GraphSignInLogs = "https://graph.microsoft.com/v1.0/auditLogs/signIns"
$result = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GraphSignInLogs -Method Get).value | Select-Object userDisplayName, userPrincipalName, appDisplayName, ipAddress, clientAppUsed, deviceDetail, location,createdDateTime | Where-Object {$_.createdDateTime -gt $SetDate }
$alluserhistory = @()
foreach ($resitem in $result){
$userhistory = New-Object PSObject -Property @{
User=$resitem.userDisplayName
UPN=$resitem.userPrincipalName
AzureAppUsed =$resitem.appDisplayName
UserApp =$resitem.clientAppUsed
IP=$resitem.ipAddress
Date=$resitem.createdDateTime
OS=($resitem.deviceDetail).operatingSystem
browser=($resitem.deviceDetail).browser
City=($resitem.location).city
Country=($resitem.location).countryOrRegion
}
$alluserhistory += $userhistory
}
Чтобы выгрузить результат в CSV файл, выполните:
$alluserhistory| Export-Csv "C:\PS\azure_login_logs.csv" –NoTypeInformation
В полученном CSV файле есть информацию о всей активности пользователя: с каких устройств и местоположений он логинился, какими приложениям Microsoft 365 пользовался. При необходимости вы можете добавить любые другие поля.
Чтобы получить время последнего входа для каждого пользователя из полученного списка, выполните команду:
$alluserhistory| Group-Object UPN |%{ $_.Group | Select UPN,Date -First 1}
Можно найти всех неактивных пользователей за указанный период. Для этого нужно получить полный список UPN пользователей в Azure через Graph API и сравнить его с ранее полученным список пользователей, которые аутентифицировались в Azure в течении последних 90 дней.
$GrapUserUrl = 'https://graph.microsoft.com/v1.0/users'
$allusers=(Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $GrapUserUrl -Method Get).value
$allusers = $allusers | Select-Object @{Name="UPN"; Expression = {$_.userprincipalname.ToLower()}}
$activeusers = $alluserhistory|select UPN –Unique
Осталось сравнить два списка. Таким образом с помощью PowerShell скрипта вы сможете найти неактивных пользователей в Microsoft 365 и освободить лицензии.
Обработка логов входа пользователей с помощью командлета Get-AzureADAuditSignInLogs из AzureADPreview
В модуле AzureADPreview есть отдельный командлет Get-AzureADAuditSignInLogs для получения информации о входах пользователей в Microsoft 365. По какой-то причине этот командлет отсутствует в продуктивном PowerShell модуле AzureAD (видимо Microsoft считает, что для нас достаточно Graph API).
Установите модуль AzureADPreview на свой компьютер:
Install-Module AzureADPreview –AllowClobber
Подключитесь к своему тенанту Azure через AzureADPreview:
AzureADPreview\Connect-AzureAD
Следующая команда вернет информацию о 10 последних входах пользователя в приложения Azure и Microsoft 365
Get-AzureADAuditSignInLogs -Filter "UserPrincipalName eq '[email protected]'" -Top 10 | select CreatedDateTime, UserPrincipalName, IsInteractive, AppDisplayName, IpAddress, TokenIssuerType, @{Name = 'DeviceOS'; Expression = {$_.DeviceDetail.OperatingSystem}}|ft
Можно вывести статистику по входам пользователей в Azure за последние 3 дня и экспортировать ее в CSV файл:
$SetDate = (Get-Date).AddDays(-3);
$SetDate = Get-Date($SetDate) -format yyyy-MM-dd
$array = Get-AzureADAuditSignInLogs -Filter "createdDateTime gt $SetDate" | select userDisplayName, userPrincipalName, appDisplayName, ipAddress, clientAppUsed, @{Name = 'DeviceOS'; Expression = {$_.DeviceDetail.OperatingSystem}},@{Name = 'Location'; Expression = {$_.Location.City}}
$array | Export-Csv "C:\PS\azurepreview_login_logs.csv" –NoTypeInformation
August 26 — Today, as communicated on Tech Community, we are providing a reminder that the end of support for Azure Active Directory (Azure AD) Graph will be on June 30, 2022. Apps using Azure AD Graph after this time will no longer receive responses from the Azure AD Graph endpoint. Since the Azure AD Graph APIs are being retired, we are also retiring the license assignment operation in the MSOnline and Azure AD PowerShell modules.
В данном примере я уже использую Microsoft Graph PowerShell вместо Azure AD Graph. На AAD Graph основаны модули MSOnline/AzureAD PowerShell — с ними, да, придется прощаться…
За инфу спасибо!