デバイスコードフロー × Graph API でクイック取得!管理センターでは出せない SharePoint サイト URL 付きレポートの出力
Microsoft 365 管理センターから出力できる 「SharePoint サイトの利用状況レポート」 は、サイトごとのストレージ使用量やアクティビティを把握するのに便利なレポートです。
しかし管理センターの画面上には 「サイト URL」 という列は表示されているものの、肝心の URL が空欄のため、どのサイトの情報が表示されているのかわからない状況に。。
📝 補足
本記事記載時点 (2026年3月) でも、Microsoft 365 管理センターの SharePoint サイト利用状況レポートではサイト URL が表示されず、Site Id のみとなる事象が継続しています。
本事象は Microsoft 側でも既知の問題とされており、管理センター上の操作だけで解消することはできません。
そこで今回は、Azure Cloud Shell を利用し、Microsoft Graph API 経由で 「サイト URL を含む利用状況レポート」 を取得する方法をご紹介します。
ブラウザーだけで完結するため、事前準備を最小限に抑えつつ、迅速かつ確実にレポートを出力できる点が特徴です。
本記事のポイントは、認証方式として 「デバイスコードフロー」 を使用する点です。
デバイスコードフローとは、CLI やスクリプトのようにブラウザー操作ができない環境でも認証を行うための仕組みで、画面に表示されたコードを別のブラウザーで入力することでログインを完了させます。
ユーザーの資格情報をスクリプトに保持する必要がないため、安全かつ手軽に利用できる認証方式です。
アプリ登録や証明書の準備といった事前作業は不要です。このような特性から、「まずは手元で素早く検証したい」 といったケースに適した方法といえます。
また本記事では、取得したレポートを SharePoint Online のライブラリへ直接保存する構成としています。
これは後続の記事において、Azure Automation とマネージド ID を利用し、この処理を 定期実行による完全自動化 へ発展させることを想定しているためです。なお、単発の実行用途であれば、ローカル環境へ出力する構成に変更しても問題ありません。
課題の確認&完成イメージ
まず管理センターからレポートをエクスポートすると、サイト URL が空欄のまま出力されることを確認できます。
そこで今回は、右図のように Site Id → Site URL を解決し、列として追加することにしました。
事前準備
1.出力先となる SharePoint ライブラリの作成
ここでは、CSV の出力先となるライブラリを任意のサイトに作成しておいてください。
今回は、 Report という名前のライブラリを作成しました。
2.Cloud Shell で Graph API を利用するためのモジュール準備
- Microsoft 365 管理センターに移動します。
- 画面右上メニューにある Cloud Shell 起動ボタンをクリックします。

- はじめて起動した方は、以下のようなダイアログが表示されるので [PowerShell] を選択します。

- 今回は、クイックに1回実行できたらいいため [ストレージアカウントは不要です] を選択します。

- 必要な Graph API のモジュールをインストールします。
Install-Module -Name Microsoft.Graph.Sites -Scope CurrentUser -Force
スクリプトの実行
以下のスクリプトを Get-SPOReport.ps1 として保存します。文字コードは UTF-8 (BOM付) を選択します。また、以下 2 行を修正しましょう。
- 15 行目にライブラリを作成したサイトの URL を指定
- 16 行目にライブラリ名を指定します。
# =========================================================
# SharePoint サイト利用状況レポートの取得・加工・保存スクリプト
# 実行環境 : Azure Cloud Shell (対話型ログイン)
# 必須モジュール : Microsoft.Graph.Authentication, Microsoft.Graph.Sites
# =========================================================
$ErrorActionPreference = "Stop"
# =========================================================
# 設定セクション:環境に合わせて以下の値を変更してください
# =========================================================
# Cloud Shell に合わせてパスの区切り文字を / に変更しています
$InputFile = "$HOME/BetaReport_Raw.csv"
$OutputFile = "$HOME/SharePoint_Usage_With_URL.csv"
$TargetSiteUrl = "https://xxxxxx.sharepoint.com/sites/xxxxx" # アップロード先サイトの URL
$TargetLibrary = "Report" # アップロード先のドキュメントライブラリ名
try {
# ---------------------------------------------------------
# Step 1: 認証 (Cloud Shell 用に対話型ログインへ変更)
# ---------------------------------------------------------
if (Get-MgContext) {
Write-Output "既存のセッションを切断しています..."
Disconnect-MgGraph
}
Write-Output "Microsoft Graph に接続しています..."
# 実行に必要な権限スコープを明示的に指定します
$Scopes = @("Reports.Read.All", "Sites.Read.All", "Files.ReadWrite.All")
Connect-MgGraph -Scopes $Scopes -NoWelcome
# ---------------------------------------------------------
# Step 2: レポートデータの取得(Graph Beta API)
# ---------------------------------------------------------
Write-Output "Graph Beta API からSharePoint サイト利用状況レポート(180 日分)を取得しています..."
$ReportUri = "https://graph.microsoft.com/beta/reports/getSharePointSiteUsageDetail(period='D180')"
Invoke-MgGraphRequest -Method GET -Uri $ReportUri -OutputFilePath $InputFile
# ---------------------------------------------------------
# Step 3: サイト URL の辞書を作成
# ---------------------------------------------------------
Write-Output "テナント内の全 SharePoint サイト情報を取得しています..."
$AllSites = Get-MgSite -All -Property "Id,WebUrl"
$SiteUrlMap = @{}
foreach ($Site in $AllSites) {
$SiteId = $Site.Id.Split(',')[1]
if (-not [string]::IsNullOrEmpty($SiteId)) {
$SiteUrlMap[$SiteId] = $Site.WebUrl
}
}
# ---------------------------------------------------------
# Step 4: レポートデータへのサイト URL 結合
# ---------------------------------------------------------
Write-Output "レポートデータにサイト URL を結合しています..."
$CsvData = Import-Csv -Path $InputFile
$ProcessedData = [System.Collections.Generic.List[object]]::new()
foreach ($Row in $CsvData) {
$TargetSiteId = $Row.'Site Id'
$RealUrl = $SiteUrlMap[$TargetSiteId]
$DisplayUrl = if ($RealUrl) { $RealUrl } else { "Not Found (削除済みまたは対象外)" }
$Row | Add-Member -MemberType NoteProperty -Name 'Site URL' -Value $DisplayUrl -Force
$ProcessedData.Add($Row)
}
$ProcessedData | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8BOM
# ---------------------------------------------------------
# Step 5: アップロード先サイトの特定
# ---------------------------------------------------------
Write-Output "アップロード先サイトを特定しています..."
$HostName = $TargetSiteUrl.Split('/')[2]
$SitePath = "/" + $TargetSiteUrl.Split('/', 4)[3]
$DestSite = Get-MgSite -SiteId "$($HostName):$($SitePath)" -Property Id
if (-not $DestSite) { throw "指定されたサイトが見つかりません: $TargetSiteUrl" }
# ---------------------------------------------------------
# Step 6: アップロード先ライブラリの特定
# ---------------------------------------------------------
Write-Output "ドキュメントライブラリ '$TargetLibrary' を特定しています..."
$DestDrive = Get-MgSiteDrive -SiteId $DestSite.Id | Where-Object { $_.Name -eq $TargetLibrary }
if (-not $DestDrive) { throw "ライブラリ '$TargetLibrary' が見つかりません。" }
# ---------------------------------------------------------
# Step 7: SharePoint へのファイルアップロード
# ---------------------------------------------------------
$TimeStamp = (Get-Date).AddHours(9).ToString("yyyyMMdd_HHmm")
$UploadFileName = "SPO_UsageReport_$TimeStamp.csv"
Write-Output "SharePoint にアップロードしています: $UploadFileName"
$UploadUri = "https://graph.microsoft.com/v1.0/drives/$($DestDrive.Id)/root:/${UploadFileName}:/content"
Invoke-MgGraphRequest -Method PUT -Uri $UploadUri -InputFilePath $OutputFile -ContentType "text/csv" | Out-Null
Write-Output "---------------------------------------------------"
Write-Output "処理が完了しました: $UploadFileName"
}
catch {
Write-Error "エラーが発生しました: $_"
throw
}
finally {
Write-Output "Microsoft Graph セッションを切断しています..."
if (Get-MgContext) { Disconnect-MgGraph }
}
スクリプトを実行します。
実行結果の確認
スクリプトの実行が完了したら、出力先に指定した SharePoint のドキュメントライブラリを確認してみましょう。このように、現在の日時が入った CSV ファイルが自動的に保存されています。
保存されたファイルを開くと、「完成イメージ」 に記載の通り、Site URL が埋まったレポートになっているので確認してみましょう!
なお、今回、Graph API の Beta 版を利用することで匿名リンク数やゲスト数のセキュリティで保護されたリンクなど出力可能な情報を増やしました。期間の調整などしたい場合は、以下 URL を参考にしてください。
参考:Microsoft Graph REST API Beta SharePoint サイトの使用状況 ファイルの詳細を取得する
まとめ
今回は、管理センターのレポートで 「サイト URL」 が表示されない問題に対し、Azure Cloud Shell と Microsoft Graph API を組み合わせて解決する方法をご紹介しました。
認証にはデバイスコードフローを利用することで、アプリ登録や証明書の準備を行うことなく、ブラウザーだけで手軽に実行できる点が大きな特徴です。そのため、現状をすぐに把握したい場合の実用的な手段として有効に活用できます。
一方で、この方法は対話型の認証を前提としているため、定期実行などの自動化には適していません。
そこで次回は、本記事のスクリプトをベースに、Azure Automation を利用した定期実行の自動化について解説します。
認証にはマネージド ID を利用し、証明書管理を不要とした セキュアな Graph API 実行環境 を構築していきます。
手動実行 (デバイスコードフロー) から、自動実行 (マネージド ID) へ移行する方法をご紹介します。
👉 次回:デバイスコードフローから マネージドID へ!Azure Automation で Graph API を動かすための環境構築
Microsoft 365 運用 関連コース
-
CI505-H Microsoft 365 運用管理
Microsoft 365 の運用管理に必要な知識と設定すべき項目を理解いただけます。アカウントやデバイス管理に不可欠な Entra ID の基礎知識をはじめ、Exchange Online、Microsoft Teams、SharePoint Online、OneDrive for Business など各サービスにおいて実施すべき設定と推奨設定、理解しておきたい仕組みなど、運用管理に必要な内容を基本から実務レベルまで解説。
-
CI509-H Microsoft 365 デバイス運用管理
Microsoft Defender、Microsoft Purview、Microsoft Entra ID を活用したセキュリティおよびコンプライアンス対策に加え、注目を集める Microsoft 365 Copilot の運用管理など、Microsoft 365 全体の情報保護に関する機能・利用シーン・運用のポイントを具体的に解説。
-
CI506-H Microsoft 365 運用管理 – 情報保護編
Microsoft Defender、Microsoft Purview、Microsoft Entra ID を活用したセキュリティおよびコンプライアンス対策に加え、注目を集める Microsoft 365 Copilot の運用管理など、Microsoft 365 全体の情報保護に関する機能・利用シーン・運用のポイントを具体的に解説。
-
CI508-H Microsoft 365 PowerShell による管理効率化
Microsoft 365 に対する運用管理で PowerShell を利用するための基本や Exchange Online、SharePoint Online、Microsoft Teams を設定するための便利なコマンドライン、設定を自動化するためのスクリプトの作成方法など、PowerShell による Microsoft 365 管理の基本から必須スキルまでを、運用管理に活用できるサンプルを用いて解説。




