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ステップでデータを取得しています。

  1. サインインアクティビティからユーザーの最終サインイン日時を取得する
  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 管理コンソール)で証明書の作成を確認できます。

MMC[[-][][][]][][]

作成された証明書(自己署名)が一覧に表示されます。後の手順で使用する**拇印(サムプリント)**をここで確認・コピーしておくと便利です。


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 権限の設定や管理者同意の付与を見直してください。


スクリプトの内部処理

スクリプトの主な処理の流れは以下のとおりです。

  1. Get-MgUser で全ユーザーを取得する
  2. 各ユーザーのサインインアクティビティから LastSignInRequestIdLastInteractiveSignInRequestId を取得する
  3. 取得した ID を使って Get-MgAuditLogSignIn で対応するサインインイベントを検索する
  4. イベントからアプリケーション名などの詳細情報を取得し、オブジェクトに追加する
  5. 最終的に CSV としてエクスポートする

ユーザー一人ひとりに対して順番にサインインイベントを取得・照合する構造になっており、シンプルながら実用的な実装です。


まとめ

本記事では、Microsoft Japan Azure AD チームが公開しているサンプルスクリプトを使い、Entra ID(旧 Azure AD)ユーザーの最終サインインレポートを PowerShell で作成する手順を解説しました。

ポイントをまとめると以下のとおりです。

  • 認証には証明書ベースの認証を使用することで、クライアントシークレットよりセキュアに自動化できます
  • Microsoft Graph API の Directory.Read.AllAuditLog.Read.All 権限が必要です
  • 出力された CSV から、ユーザーごとの最終サインイン日時と使用アプリケーションを確認できます
  • TimeZone "Tokyo Standard Time" を指定することで、日本時間(JST)での出力が可能です
  • ユーザー数が多い環境では処理時間が長くなるため、Azure VM など安定したネットワーク環境での実行を推奨します

適切な権限さえ用意できれば、それほど難しい手順ではありませんので、ぜひ試してみてください。