Microsoft Entra ID ユーザーが最後にサインインした日時を調べる

皆さんこんにちは。国井です。
かつてAzure ADと呼ばれていたMicrosoft Entra IDですが、
(なんかこの言い方、旧TwitterであるXぐらいに面倒くさい)
Microsoft Entra IDに作られたユーザーが不要かどうかを判断するのに最後にサインインした日時を調べたいってとき、ありませんか?しかしMicrosoft Entra IDは30日前までのサインインログしか保存されないので30日以上前のサインインに関しては追跡できません。だからといって30日サインインしていないから、といってユーザー自体を勝手に削除するわけにもいかないでしょう。

この質問に対する教科書的な答えはLog Analyticsワークスペースを使いましょう!になります。30日以上前のログも保管できるLog Analyticsワークスペースにログを転送しておけばクエリを実行して検索できるので、こんなクエリを書いてあげれば問題解決できます。

SigninLogs
| summarize arg_max(TimeGenerated,*) by UserPrincipalName
| order by TimeGenerated asc

image

だけどこのブログを見に来た人は、それができないからどうしたら良いか求めている人ですよね??ということでサインインログの転送設定をしていないケースでどうやってユーザーが最後にサインインした日時を調べればよいか?これを探ってみたいと思います。

デバイスの属性を参照しよう

いきなり答えです。
最後にサインインした日時はユーザーの属性ではなく、デバイスの属性に保存されています。

image

デバイスの属性を手掛かりにしていけば最後にサインインした日時がなんとなくわかると思います。「なんとなく」という言葉で察した人もいると思いますが、この調べ方には大きな穴があります。それは

・そのデバイスでサインインしたユーザーは正確に把握できない
・デバイスの属性と言ってるけど、そもそもMicrosoft Entra IDに登録されたデバイスでないと調べられない

の2点です。
この点を踏まえた上であれば、この調べ方はある程度有効な方法なわけです。
じゃあ見てみましょう。

PowerShellでまとめて表示する

Microsoft Entra管理センターからすべてのデバイスを参照し、特定のデバイスのプロパティを開くとデバイスの名前や最後にサインインした日時、そしてそのデバイスの所有者が確認できます。

image

つまりこれを使えば、そのユーザーが最後にサインインした日時がいつか?というのは「おおよそ」の特定ができるのです。そしたらこれを従業員全員分をまとめて表示できるようにPowerShellを使ってみてみましょう。

Connect-MgGraph -Scopes "User.Read.All","Device.Read.All"
Get-MgDevice |fl

これで前の画面のような表示で結果が出てきて、最後にサインインした日時はデバイスのapproximateLastSignInDateTime属性で確認できます。
一方、所有者の情報はGet-MgDeviceRegisteredOwnerコマンドレットで確認できます。
こんな感じで実行するときはデバイスのオブジェクトIDを指定します。

$Devices=Get-MgDevice
ForEach ($Device in $Devices) {
Get-MgDeviceRegisteredOwner -Deviceid $Device.id
}

ただこれだけで実行しても所有者の情報は表示されないので、実行結果からAdditionalProperties内のuserPrincipalNameプロパティにアクセスする必要があります。
そのため、こんな感じに書き換えてあげます。

$Devices=Get-MgDevice
ForEach ($Device in $Devices) {
(Get-MgDeviceRegisteredOwner -Deviceid $Device.id).AdditionalProperties.userPrincipalName
}

image

所有者のユーザープリンシパル名が結果として表示されたことがわかりました。
ここまでできたら最後にデバイスの名前と一緒に表示してあげましょう。

$Datas = @()
$Data = New-Object PSObject | Select-Object userprincipalName, DisplayName, approximateLastSignInDateTime
$Devices=Get-MgDevice
ForEach ($Device in $Devices) {
$Data.userprincipalName=(Get-MgDeviceRegisteredOwner -Deviceid $Device.id).AdditionalProperties.userPrincipalName
$Data.DisplayName=$Device.DisplayName
$Data.approximateLastSignInDateTime=$Device.approximateLastSignInDateTime
$Datas += $Data
}
$Datas |ft -AutoSize

image

こんな感じでまとめて表示することができます。