PowerShellスクリプトでAzure AD(Entra ID)の最終サインインレポートを作成する
この記事の内容
- Microsoft Japan Azure AD チームが公開しているサンプルスクリプトを使い、Entra ID(旧 Azure AD)ユーザーの最終サインイン日時をPowerShellで取得する手順を解説します
- 認証にはクライアントシークレットではなく証明書を使用し、よりセキュアな自動化を実現します
- Microsoft Graph SDK for PowerShell を使って、監査ログからサインインアクティビティを取得します
- スクリプト実行の前提条件として Azure AD Premium P1 以上のライセンスが必要です
- 出力はCSVファイルで、ユーザーごとの最終サインイン日時と使用アプリケーション名が確認できます
概要
本記事では、Microsoft Japan の Azure AD / Entra ID チームが公開しているサンプルスクリプト「GetLastSignInReport」を実際に動かしながら、ユーザーの最終サインイン情報を取得する手順をご紹介します。
このスクリプトは内部で Microsoft Graph API を利用しており、以下の2ステップでデータを取得しています。
- サインインアクティビティからユーザーの最終サインイン日時を取得する
- サインインログから最終サインイン時に使用したアプリケーション名を取得する
なお、ユーザーが最後に利用したアプリケーションを取得するには、Azure AD Premium P1 ライセンス以上が必要です。あくまでサンプルスクリプトですので、自己責任のうえご利用ください。
事前準備
PowerShell 実行ポリシーの変更
まず、ダウンロードしたスクリプトを実行できるよう、実行ポリシーを変更します。管理者として PowerShell を起動したうえで、以下のコマンドを実行してください。
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser
注意: Windows PowerShell と PowerShell(新バージョン)ではモジュールの管理が独立しています。どちらのバージョンを使用するか事前に決め、以降の手順を同じ環境で統一して進めてください。
スクリプトのダウンロードと配置
サンプルスクリプトをダウンロードし、任意の場所に展開します。本記事では例に合わせて C:\SignReport に配置します。
# 作業ディレクトリへ移動
cd C:\SignReport
証明書の作成
認証にはクライアントシークレットではなく自己署名証明書を使用します。証明書認証はシークレット漏洩のリスクを抑えられるため、よりセキュアな方式です。
スクリプトに同梱されている Create-ExportCert.ps1 を実行すると、以下が自動で行われます。
- 自己署名証明書を生成し、現在のユーザーの証明書ストア(個人) に格納する
- 公開鍵のみを含む
.cerファイルをカレントディレクトリに出力する
.\Create-ExportCert.ps1
実行後、MMC(Microsoft 管理コンソール)で証明書の作成を確認できます。
作成された証明書(自己署名)が一覧に表示されます。後の手順で使用する**拇印(サムプリント)**をここで確認・コピーしておくと便利です。
Microsoft Graph SDK for PowerShell のインストール
次に、Microsoft Graph を PowerShell から操作するためのモジュールをインストールします。
Install-Module Microsoft.Graph -Scope CurrentUser
すでに古いバージョンが入っている場合は、-Force および -AllowClobber オプションを付けて強制インストールします。
Install-Module Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
インストール後、バージョンを確認します。スクリプトの実行には Microsoft.Graph.Users 1.27.0 以降が必要です。
Get-InstalledModule Microsoft.Graph.Users
Azure AD(Entra ID)へのアプリ登録
アプリの登録
Azure ポータル(portal.azure.com)にグローバル管理者でサインインし、Azure Active Directory → アプリの登録 → 新規登録 と進みます。
- 名前: 任意(例:
SignReport) - サポートされているアカウントの種類: このディレクトリのみ(シングルテナント)
登録後、以下の2つの値を控えておきます。
| 項目 | 場所 |
|---|---|
| アプリケーション(クライアント)ID | アプリ概要ページ |
| ディレクトリ(テナント)ID | アプリ概要ページ |
API アクセス許可の設定
[API のアクセス許可] → [アクセス許可の追加] → [Microsoft Graph] → [アプリケーションの許可] と進み、以下の2つの権限を追加します。
| 権限 | 用途 |
|---|---|
Directory.Read.All | ユーザー情報の読み取り |
AuditLog.Read.All | 監査ログ(サインインログ)の読み取り |
追加後、[管理者の同意を与える] をクリックして権限を有効化します。
証明書のアップロード
[証明書とシークレット] → [証明書] → [証明書のアップロード] と進み、先ほど作成した .cer ファイル(公開鍵のみ)をアップロードします。
これにより、ローカルに保持している秘密鍵(証明書ストア内)と組み合わせて、このアプリケーションとして認証できる状態になります。
スクリプトの実行
実行コマンド
メインスクリプト Get-LastSignIn.ps1 を以下のように引数を指定して実行します。
.\Get-LastSignIn.ps1 `
-CertificateThumbprint "<証明書の拇印>" `
-TenantId "<テナントID>" `
-ClientId "<アプリケーションID>" `
-OutputCsvPath "LastSignIn.csv"
日本時間(JST)で出力したい場合は、タイムゾーンパラメーターを追加します。
.\Get-LastSignIn.ps1 `
-CertificateThumbprint "<証明書の拇印>" `
-TenantId "<テナントID>" `
-ClientId "<アプリケーションID>" `
-OutputCsvPath "LastSignIn.csv" `
-TimeZone "Tokyo Standard Time"
実行結果
スクリプトが正常に完了すると、指定したパスに CSV ファイルが出力されます。CSV には以下の列が含まれます。
| 列名 | 内容 |
|---|---|
Id | ユーザーオブジェクト ID |
UserPrincipalName | ユーザー名 |
LastSignInDateUtc | 最終サインイン日時(UTC) |
AppDisplayName | 最終サインイン時に使用したアプリ名 |
LastInteractiveSignInDateUtc | 最終インタラクティブサインイン日時 |
InteractiveAppDisplayName | インタラクティブサインイン時のアプリ名 |
ユーザー数が多い環境や低速なネットワーク環境では処理に時間がかかります。Azure VM 上など、ネットワーク的に安定した環境で実行することをお勧めします。
スクリプト動作確認(手動コマンド)
スクリプトがうまく動かない場合は、以下のコマンドで個別に動作確認できます。
Microsoft Graph への接続(サービスプリンシパルとして)
Connect-MgGraph `
-ClientId "<アプリケーションID>" `
-CertificateThumbprint "<証明書の拇印>" `
-TenantId "<テナントID>"
「Welcome to Microsoft Graph!」と表示されれば接続成功です。
ユーザー情報の取得確認
# Beta API プロファイルを使用
Select-MgProfile -Name beta
# ユーザー一覧の取得
Get-MgUser
監査ログ(サインインログ)の取得確認
Get-MgAuditLogSignIn
このコマンドが正常に動作することが、スクリプト実行の前提条件となります。エラーが出る場合は、API 権限の設定や管理者同意の付与を見直してください。
スクリプトの内部処理
スクリプトの主な処理の流れは以下のとおりです。
Get-MgUserで全ユーザーを取得する- 各ユーザーのサインインアクティビティから
LastSignInRequestIdとLastInteractiveSignInRequestIdを取得する - 取得した ID を使って
Get-MgAuditLogSignInで対応するサインインイベントを検索する - イベントからアプリケーション名などの詳細情報を取得し、オブジェクトに追加する
- 最終的に CSV としてエクスポートする
ユーザー一人ひとりに対して順番にサインインイベントを取得・照合する構造になっており、シンプルながら実用的な実装です。
まとめ
本記事では、Microsoft Japan Azure AD チームが公開しているサンプルスクリプトを使い、Entra ID(旧 Azure AD)ユーザーの最終サインインレポートを PowerShell で作成する手順を解説しました。
ポイントをまとめると以下のとおりです。
- 認証には証明書ベースの認証を使用することで、クライアントシークレットよりセキュアに自動化できます
- Microsoft Graph API の
Directory.Read.AllとAuditLog.Read.All権限が必要です - 出力された CSV から、ユーザーごとの最終サインイン日時と使用アプリケーションを確認できます
TimeZone "Tokyo Standard Time"を指定することで、日本時間(JST)での出力が可能です- ユーザー数が多い環境では処理時間が長くなるため、Azure VM など安定したネットワーク環境での実行を推奨します
適切な権限さえ用意できれば、それほど難しい手順ではありませんので、ぜひ試してみてください。