Quantcast
Channel: TechNet Blogs
Viewing all articles
Browse latest Browse all 34890

Microsoft Graph API を利用して Azure AD のサインイン アクティビティ レポートを CSV ファイルで取得する PowerShell スクリプト

$
0
0

こんにちは、Azure & Identity サポート チームの 姚 (ヨウ)です。

 

前回 Azure AD のサインイン アクティビティ レポートと監査アクティビティ レポートを Azure AD Graph API を経緯し、PowerShell csv 形式で取得できるスクリプトを紹介ました。

 

既にご存知の方もいると思うのですが、マイクロソフトとしては、Azure AD Graph API ではなく、今後は Microsoft Graph API の利用を推進しております。

 

今回は、PowerShell スクリプトで Microsoft Graph API を利用して Azure AD のサインイン アクティビティ レポートを csv 形式で取得する方法を紹介いたします。

なお、今回のスクリプトでは前回紹介しましたスクリプトと比較してサインイン アクティビティ レポートの内容をより詳細に csv ファイルに格納するようにしています。

 

 

1. 以下のドキュメントに記載された手順に従って、アプリケーションを登録し、"構成設定を収集する" に従って必要な情報を取得します。

 

Azure AD Reporting API にアクセスするための前提条件

https://docs.microsoft.com/ja-jp/azure/active-directory/active-directory-reporting-api-prerequisites-azure-portal

 

2. テキスト エディタを開き、次の中身をコピーし環境に合わせて赤字部分の内容を設定します。その後 .ps1 ファイルとして保存し、実行します。

これによりサインイン アクティビティ レポートを csv ファイルとして取得できます。

 

=======================================================================================================

$clientID       = "<アプリケーションのクライアント ID>" # 手順の 1 で作成したアプリケーションのクライアント ID です。

$clientSecret   = "<アプリケーションのクライアント シークレット>" # 手順の 1 で作成したアプリケーションのクライアント シークレットです。

$loginURL       = "https://login.windows.net/"

$tenantdomain   = "<対象のテナント ドメイン名>" # 利用されている Azure AD のテナント名です。例えば contoso.onmicrosoft.com です。

$msgraphEndpoint = "https://graph.microsoft.com"

$outfile =  "<出力ファイルのファイル名>.csv"

$data=@()

 

# Get an Oauth 2 access token based on client id, secret and tenant domain

$body       = @{grant_type="client_credentials";resource=$msgraphEndpoint;client_id=$clientID;client_secret=$clientSecret}

$oauth      = Invoke-RestMethod -Method Post -Uri $loginURL/$tenantdomain/oauth2/token?api-version=1.0 -Body $body

 

if ($oauth.access_token -ne $null) {

$headerParams = @{'Authorization'="$($oauth.token_type) $($oauth.access_token)"}

 

$url = "$msgraphEndpoint/beta/auditLogs/signIns"

Write-Output "Fetching data using Uri: $url"

 

Do{

$myReport = (Invoke-WebRequest -UseBasicParsing -Headers $headerParams -Uri $url)

$myReportValue = ($myReport.Content | ConvertFrom-Json).value

$myReportVaultCount = $myReportValue.Count

 

for ($j=0; $j -lt $myReportVaultCount; $j++)

{

$eachEvent =@{}

 

$thisEvent = $myReportValue[$j]

$canumbers = $thisEvent.conditionalAccessPolicies.Count

 

$eachEvent = $thisEvent |

select id,

createdDateTime,

userDisplayName,

userPrincipalName,

userId,

appId,

appDisplayName,

ipAddress,

clientAppUsed,

mfaDetail,

correlationId,

conditionalAccessStatus,

isRisky,

riskLevel,

 

@{Name='status.errorCode';Expression={$_.status.errorCode}},

@{Name='status.failureReason';Expression={$_.status.failureReason}},

@{Name='status.additionalDetails';Expression={$_.status.additionalDetails}},

 

@{Name='deviceDetail.deviceId';Expression={$_.deviceDetail.deviceId}},

@{Name='deviceDetail.displayName';Expression={$_.deviceDetail.displayName}},

@{Name='deviceDetail.operatingSystem';Expression={$_.deviceDetail.operatingSystem}},

@{Name='deviceDetail.browser';Expression={$_.deviceDetail.browser}},

 

@{Name='location.city';Expression={$_.location.city}},

@{Name='location.state';Expression={$_.location.state}},

@{Name='location.countryOrRegion';Expression={$_.location.countryOrRegion}},

@{Name='location.geoCoordinates.altitude';Expression={$_.location.geoCoordinates.altitude}},

@{Name='location.geoCoordinates.latitude';Expression={$_.location.geoCoordinates.latitude}},

@{Name='location.geoCoordinates.longitude';Expression={$_.location.geoCoordinates.longitude}}

 

for ($k=0; $k -lt $canumbers; $k++)

{

$temp = $thisEvent.conditionalAccessPolicies[$k].id

$eachEvent = $eachEvent | Add-Member @{"conditionalAccessPolicies.id$k" =$temp} -PassThru

 

$temp = $thisEvent.conditionalAccessPolicies[$k].displayName

$eachEvent = $eachEvent | Add-Member @{"conditionalAccessPolicies.displayName$k" =$temp} -PassThru

 

$temp = $thisEvent.conditionalAccessPolicies[$k].enforcedGrantControls

$eachEvent = $eachEvent | Add-Member @{"conditionalAccessPolicies.enforcedGrantControls$k" =$temp} -PassThru

 

$temp = $thisEvent.conditionalAccessPolicies[$k].enforcedSessionControls

$eachEvent = $eachEvent | Add-Member @{"conditionalAccessPolicies.enforcedSessionControls$k" =$temp} -PassThru

 

$temp = $thisEvent.conditionalAccessPolicies[$k].result

$eachEvent = $eachEvent | Add-Member @{"conditionalAccessPolicies.result$k" =$temp} -PassThru

}

$data += $eachEvent

 

}

 

#Get url from next link

$url = ($myReport.Content | ConvertFrom-Json).'@odata.nextLink'

}while($url -ne $null)

 

} else {

Write-Host "ERROR: No Access Token"

}

 

$data | Sort -Property createdDateTime  | Export-Csv $outfile -encoding "utf8" -NoTypeInformation

=======================================================================================================

 

 

このスクリプトで取得できるサインイン アクティビティ レポートをさらに詳細にフィルターしたい場合、以下の公開情報を参照いただければと思います。

 

signIn resource type

https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/resources/signin

 

 

次回は監査アクティビティ レポートの取得方法を紹介いたします。

 

 

このブログの情報がお客様の検証や運用のお役に少しでもお役に立てばと思います。

 

製品動作に関する正式な見解や回答については、お客様環境などを十分に把握したうえでサポート部門より提供させていただきますので、ぜひ弊社サポート サービスをご利用ください。

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。


Viewing all articles
Browse latest Browse all 34890

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>