Azure AD ライセンスの割り当てを行ったユーザーのレポート
Azure AD アカウントにライセンスを割り当てたのは誰ですか?
Azure AD アカウントに割り当てられた使用頻度の低い (および高価な) ライセンスを検出する方法について書いた後、アカウントにライセンスを割り当てたユーザーを報告できるかどうかを尋ねられました。それは一瞬私を困惑させた良い質問です。Microsoft 365 管理インターフェイスのアカウントにライセンスを割り当てたユーザーについて、既製の明確な表示はありません。
Azure AD Audit Data
ライセンスの割り当ては、Azure AD アクティビティです。したがって、これらのアクションに関する情報は、 Azure AD 監査ログ 「ユーザー ライセンスの変更」イベントを検索します。残念ながら、これらのイベントは、何らかのライセンス割り当てが発生したことだけに注意します。ライセンスの追加、削除、またはサービス プランの無効化に関してライセンスに何が起こったかはわかりません。その情報については、ライセンス割り当ての詳細が[変更されたプロパティ]タブでキャプチャされる一致する「ユーザーの更新」イベントを見つける必要があります(図1)。

残念ながら、 Get-MgAuditLogDirectoryAudit コマンドレットはライセンスの割り当てについて同じレベルの詳細を報告しないため、Azure AD 監査ログはレポートに適したソースではありません。
Office 365 監査ログでの Azure AD ライセンスの割り当て
Azure AD は Office 365 (統合) 監査ログのソースであり、Office 365 監査ログに取り込まれる情報は、データの取得が容易ではないように書式設定されていますが、より包括的です。ただし、PowerShell スクリプトを作成して、少なくとも管理者にライセンスを割り当てるユーザーに関する洞察を与えるのに十分な情報を含む基本レポートを作成するのに十分なデータを見つけることができます。
レポートを作成するには、スクリプトは次の操作を行います。
- 実行した Search-UnifiedAuditLog コマンドレットを使用して、[ユーザー ライセンスの変更]アクションと[ユーザーの更新]アクションの監査レコードを取得します。
- 両方のタイプのイベントに対して別々の配列を作成します。
- ユーザー ライセンスの変更イベントごとに、一致する Update ユーザー レコードがあるかどうかを確認します。見つかった場合は、レコードからライセンス割り当て情報を抽出します。
- 見つかったことを報告します。
この概念が機能することを証明するスクリプトを次に示します。
# Azure AD license assignment script $StartDate = (Get-Date).AddDays(-90) $EndDate = (Get-Date).AddDays(1) Write-Host "Searching for license assignment audit records" [array]$Records = Search-UnifiedAuditLog -StartDate $StartDate -EndDate $EndDate -Formatted -ResultSize 5000 -Operations "Change user license", "Update User" If (!($Records)) { Write-Host "No audit records found... exiting... " ; break} Write-Host ("Processing {0} records" -f $Records.count) [array]$LicenseUpdates = $Records | Where-Object {$_.Operations -eq "Change user license."} [array]$UserUpdates = $Records | Where-Object {$_.Operations -eq "Update user."} $Report = [System.Collections.Generic.List[Object]]::new() ForEach ($L in $LicenseUpdates) { $NewLicenses = $Null; $OldLicenses = $Null $AuditData = $L.AuditData | ConvertFrom-Json $CreationDate = Get-Date($L.CreationDate) -format s [array]$Detail = $UserUpdates | Where-Object {$_.CreationDate -eq $CreationDate -and $_.UserIds -eq $L.UserIds} If ($Detail) { # Found a user update record $LicenseData = $Detail[0].AuditData | ConvertFrom-Json $NewLicenses = $LicenseData.ModifiedProperties | Where {$_.Name -eq 'AssignedLicense'} | Select-Object -ExpandProperty NewValue | Convertfrom-Json $OldLicenses = $LicenseData.ModifiedProperties | Where {$_.Name -eq 'AssignedLicense'} | Select-Object -ExpandProperty OldValue | Convertfrom-Json } # end if $ReportLine = [PSCustomObject] @{ Operation = $AuditData.Operation Timestamp = Get-Date($AuditData.CreationTime) -format g 'Assigned by' = $AuditData.UserId 'Assigned to' = $AuditData.ObjectId 'New licenses' = $NewLicenses 'Old licenses' = $OldLicenses } $Report.Add($ReportLine) } $Report = $Report | Sort-Object {$_.TimeStamp -as [datetime]} $Report | Out-GridView
出力はまばらですが(図2)、ライセンスの割り当てが発生したときに何が起こるかを理解するだけで十分だと思います。ライセンスの詳細のないイベントは、管理者がアカウントからライセンスまたはサービス プランをライセンスから削除したときのように見えます。

私はライセンスの詳細を解析しようと気にしませんでした。Azure AD によって返される情報には、アカウントに割り当てられたすべてのライセンスが含まれているため、3 つのライセンスを持つアカウントでは、このようなものになります。個々のライセンスと無効なサービス プランをこの情報から切り離すことは、読者にとっての演習です。
$NewLicenses.Split(',') [SkuName=POWER_BI_STANDARD AccountId=a662313f-14fc-43a2-9a7a-d2e27f4f3478 SkuId=a403ebcc-fae0-4ca2-8c8c-7a907fd6c235 DisabledPlans=[]] [SkuName=ENTERPRISEPACK AccountId=a662313f-14fc-43a2-9a7a-d2e27f4f3478 SkuId=6fd2c87f-b296-42f0-b197-1e91e994b900 DisabledPlans=[]] [SkuName=TOPIC_EXPERIENCES AccountId=a662313f-14fc-43a2-9a7a-d2e27f4f3478 SkuId=4016f256-b063-4864-816e-d818aad600c9 DisabledPlans=[]]
プリンシパル証明
いずれにしても、この質問に対する答えは、監査ログを使用してこれらのアクションに関連するイベントを抽出し、イベント内の情報を解析することで、Azure AD ライセンスの割り当てを追跡および報告できることです。結果の出力はきれいではないかもしれませんが(クリーンアップすることはできます)、プリンシパルを証明するのに十分です。
Microsoft 365 テナント管理者が利用できるデータを利用する方法については、 IT プロフェッショナル向け Office 365 電子ブック。私たちは、物事がどのように機能するかを理解するのが大好きです。
ディスカッション
コメント一覧
まだ、コメントがありません