Microsoftが2026年3月にMC1243549でアナウンスした変更が、いよいよPhase 2(10月中にロールアウト)を迎えます。
SharePoint OnlineやOneDrive for Businessを使って、自社のMicrosoft Entra ID外のユーザーと共有している場合、何もせずにいると大きな影響があるのでMC1243549の概要とその影響、事前に実施すべきことをまとめてみました。
本作業は一部監査対応と同等の作業を行うため、実施にあたっては社内のポリシーを必ず確認し、実行履歴を残してください。
また、Entra B2Bゲストを運用するうえで注意点があるので、最後までお読みいただくことを強く推奨しています。
目次
何が変わるのか
OneDrive for Businessは、コンシューマー向けのOneDriveと違ってバックエンドにSharePoint Onlineがいます。
なので、影響範囲はOneDrive for BusinessだけでなくSharePoint Onlineも含まれるのですが、普段僕がOneDrive for Businessしか利用していないので、記事内ではOneDrive for Businessにフォーカスを当てています。

OneDrive for Businessでファイルを外部と共有する際、「名前、グループ、またはメールを追加する」欄に、外部の方のメールアドレスを入力して「送信」をクリックする運用を取られているかと思います。
今までは「送信」をクリックすると、共有先にファイルが共有された旨のメールが届き、リンクをクリックすると本人確認のためのコード送信(OTP)を行い、本人確認後にアクセスできるといった仕組みでした。
この仕組みをSPO OTP(SharePoint Online One-Time Passcode)と呼ぶのですが、MC1243549によると本機能は2026年5月から新規共有分はMicrosoft Entra B2B(Microsoft Entraゲストアカウント)ベースのアクセスに切り替わりました。
「OneDrive for Businessの外部共有なら、従業員向けのマニュアルを用意しておけばよいな」と認識していた情シスの方にとっては結構寝耳に水な話で、2026年5月以降は管理者の承諾なく自社のMicrosoft Entra ID上にゲストアカウントが作成されているんですよね。
その一方で2026年5月より前に、外部の方に共有していたファイルはアクセス権限の更新などを行っていなければ、SPO OTPで引き続きアクセスできていたのですが、2026年10月中にロールアウトされるPhase 2では過去にSPO OTPで払い出した共有リンクが完全に廃止されてしまうんです。
今回はこのSPO OTP廃止までの時系列に触れつつ、影響を受ける/受けないパターンの洗い出しと、影響、とるべき対策についてまとめていますので是非参考にしてください。
SPO OTP廃止までの時系列
実は、OneDrive for Businessの外部共有をEntra B2B統合されるようになったのは結構前から起きていたんですよね。
今回記事を作成するにあたって自分もそんな前からだったっけ……?となったので、時系列を以下にまとめてみます。
- 2021年ごろ:Entra B2B共有がオプトインで提供され始める
- 2023年半ばごろ:新規作成されたテナントではEntra B2B共有がデフォルトで有効になる
- 2025年7月ごろ:すでにEntra B2B共有をオプトイン済みだったテナントでSPO OTPが廃止される(MC1089315)
- 2026年4月末:既存テナントのEntra B2B共有の手動オプトイン最終期限
- 2026年5月中:全テナントで新規共有がEntra B2B共有に切り替わる(Phase 1、すでにロールアウト済み)
- 2026年10月中:SPO OTP完全廃止予定(Phase 2、SPO OTPで発行済みの招待リンクが使えなくなる)
※当初Phase 2は7月1日~8月31日までにロールアウト予定でしたが、7月17日に期限が延期されています。
一度SPO OTP完全廃止の期限が延期されているものの、次も必ず延期されるとは限らないので今のうちにPhase 2に向けた対応が必要というわけです。
なお、10月末以降にこの記事を読まれた方は既にアクセス拒否が発生している可能性があるため、下記の対応をすぐに実施してください
影響を受けるケース、受けないケース
今回のSPO OTP廃止はすべてのケースで影響を受けるわけではなく、下記の通り影響を受けるパターンと受けないパターンがあります。
- 影響を受けるケース
- 2026年4月以前に下記を行っていた
- 特定のユーザーとファイルを共有する際、外部の個人メール宛てに共有していた。
- 特定のユーザーとファイルを共有する際、他組織アカウント宛てに共有していた。
- 2026年4月以前に下記を行っていた
- 影響を受けないケース
- 共有リンク設定で「すべてのユーザー」を指定して共有している。
- 既に自社テナント内にEntra B2Bゲストアカウントをもつユーザーと共有している。
- テナント内のユーザー間で共有している。
影響範囲の洗い出し
外部共有先の洗い出し
本作業は実務上有用なテクニックですが、テナント内全ユーザーのサイトに対して一時的に管理者権限を付与します。
今回は個人の検証環境で実施していますが、実運用では従業員のサイトを操作するため、必ず実施記録を残すことや、社内の監査ポリシーを確認すること、部門長への確認やセキュリティ関連の部署に承認を得る、終了後は速やかに権限を削除するなど、十分に注意してください。

冒頭で、「OneDrive for Businessの外部共有なら、従業員向けのマニュアルを用意しておけばよいな」という運用例を挙げましたが、影響範囲はSharePoint管理センターから、テナント内のそれぞれのサイトURLにアクセスし、画面右上の歯車アイコン→「サイトの利用状況」をクリックします。

サイトの利用状況画面に遷移するので、ページを下にスクロールすると「外部ユーザーと共有」内の「レポート実行」をクリックすることで、外部共有の状況が取得できます。
ただ欠点として、テナント全体のレポートを出力する機能はなく、サイトごとの出力が必要です。加えて記憶が正しければMicrosoft 365 Apps for enterpriseでOneDrive for Businessを利用している場合、ユーザーごとにサイトが作成されるのでかなりの重労働になってしまいます……
SharePoint Online Management Shellや、Microsoft Graph APIを使えばCLIでも一覧取得できますが、今回は共有しているファイル名やリンクが必要なのではなく、「SPO OTPで共有した外部メールアドレスのうち、まだEntra B2Bゲストになっていないもの」を洗い出せばよいので、PowerShell 7系列で使えるPnP.PowerShellモジュールを使って出力したデータを突合すれば影響範囲を特定できます。
# ============================================================
# 初回セットアップ(一度だけ実行してください)
# ============================================================
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Install-Module -Name PnP.PowerShell -Force -AllowClobber
# Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "PnP-PowerShell" -Tenant "<テナントID>"
# ============================================================
# 共通設定
# ============================================================
$TenantName="<テナント名>"
# 例:syobonlab
$ClientId="<AzureAppId>"
# Register-PnPEntraIDAppForInteractiveLoginで生成されたID
$AdminUPN="<管理者のUPN>"
# 例: admin@hogehoge.onmicrosoft.com
$AdminSiteUrl="https://$TenantName-admin.sharepoint.com"
# 「各サイトに接続して外部ユーザーを取得」、「サイトコレクション管理者を削除(後始末)」
# ではログインしているユーザーのホームディレクトリ(C:\Users\hogehoge)内に
# それぞれCSVファイルを出力しています
# ============================================================
# 管理センターに接続して全OneDriveサイト取得
# ============================================================
Connect-PnPOnline -Url $AdminSiteUrl -Interactive -ClientId $ClientId
$OneDriveSites = Get-PnPTenantSite -IncludeOneDriveSites -Filter "Url -like '*-my.sharepoint.com/personal/*'"
Write-Host "対象OneDriveサイト数: $($OneDriveSites.Count)" -ForegroundColor Cyan
# ============================================================
# サイトコレクション管理者を追加
# ============================================================
foreach ($Site in $OneDriveSites) {
try {
Set-PnPTenantSite -Identity $Site.Url -Owners $AdminUPN
Write-Host "Added: $($Site.Url)" -ForegroundColor Green
} catch {
Write-Warning "Failed to add: $($Site.Url) - $($_.Exception.Message)"
}
}
# ============================================================
# 各サイトに接続して外部ユーザーを取得
# ============================================================
$ExternalUsers = @()
foreach ($Site in $OneDriveSites) {
Write-Host "Checking: $($Site.Url)"
try {
Connect-PnPOnline -Url $Site.Url -Interactive -ClientId $ClientId
$Users = Get-PnPUser | Where-Object {
$_.LoginName -like "*#ext#*" -or $_.LoginName -like "*urn:spo:guest*"
}
if ($Users) {
$ExternalUsers += $Users | Select-Object `
@{N='SiteUrl'; E={$Site.Url}},
LoginName,
Title,
@{N='ResolvedEmail'; E={
if ($_.Email) {
$_.Email
} elseif ($_.LoginName -match '\|([^|]+)#ext#') {
$matches[1] -replace '_', '@'
} else {
$null
}
}},
Email
}
} catch {
Write-Warning "Failed on $($Site.Url): $($_.Exception.Message)"
}
}
$ExternalUsers | Export-Csv -Path "~/External-Users-in-PnP.csv" -NoTypeInformation -Encoding UTF8BOM
Write-Host "外部ユーザー出力: ~/External-Users-in-PnP.csv" -ForegroundColor Cyan
# ============================================================
# サイトコレクション管理者を削除(後始末)
# ============================================================
$success = 0
$failed = 0
$failedSites = @()
foreach ($Site in $OneDriveSites) {
try {
Connect-PnPOnline -Url $Site.Url -Interactive -ClientId $ClientId
Remove-PnPSiteCollectionAdmin -Owners $AdminUPN
Write-Host "Removed: $($Site.Url)" -ForegroundColor Yellow
$success++
} catch {
$failedSites += [PSCustomObject]@{
SiteUrl = $Site.Url
ErrorMessage = $_.Exception.Message
Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}
Write-Warning "Failed to remove: $($Site.Url) - $($_.Exception.Message)"
$failed++
}
}
Write-Host "`n完了: 成功=$success, 失敗=$failed" -ForegroundColor Cyan
if ($failedSites.Count -gt 0) {
$failedSites | Export-Csv `
-Path "~/Remove-PnPSiteCollectionAdmin-failed.csv" `
-NoTypeInformation -Encoding UTF8BOM
Write-Host "失敗リスト出力: ~/Remove-PnPSiteCollectionAdmin-failed.csv" -ForegroundColor Yellow
}
Entra B2Bゲスト一覧の取得
# ============================================================
# 初回セットアップ(一度だけ実行してください)
# ============================================================
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Install-Module -Name Microsoft.Graph.Authentication -Force -AllowClobber
# Install-Module -Name Microsoft.Graph.Users -Force -AllowClobber
# ============================================================
# Entra IDに接続してB2Bゲスト一覧を取得
# ============================================================
Connect-MgGraph -Scopes "User.Read.All"
$guests = Get-MgUser -Filter "userType eq 'Guest'" -All `
-Property Id, DisplayName, UserPrincipalName, Mail, OtherMails, UserType, CreatedDateTime
Write-Host "取得したEntra B2Bゲスト数: $($guests.Count)" -ForegroundColor Cyan
# ============================================================
# CSV出力
# ============================================================
$guests | Select-Object `
DisplayName,
UserPrincipalName,
Mail,
@{N='OtherMails'; E={ $_.OtherMails -join ';' }},
UserType,
CreatedDateTime |
Export-Csv -Path "~/Entra-B2B-Guests.csv" `
-NoTypeInformation -Encoding UTF8BOM
Write-Host "Entra B2Bゲスト一覧出力: ~/Entra-B2B-Guests.csv" -ForegroundColor Cyan
# ============================================================
# 接続解除
# ============================================================
Disconnect-MgGraph
あとは出力されたファイルをもとに突合を行い、Entra B2Bゲスト招待が必要な対象を特定します。
対応方法
Entra B2Bゲスト招待が必要な対象を特定できたので、いよいよ次はEntra B2Bゲスト招待を実施します。
対応方法は以下の3点ですが、外部共有先に不信感を与えないためにも手順1を僕は推奨しますが、社内ユーザーのリテラシーに合わせて、組織に合った方法で対応してください。
- 対応方法1:外部ユーザーに対して、再共有を実施してもらう(複数共有している場合は1件のみでOK)
- 対応方法2:Microsoft Entra管理センター(https://entra.microsoft.com)から手動で招待
- 対応方法3:PowerShellを使った一括招待
Entra B2Bゲスト招待は外部共有先にEntra B2Bゲストの招待メールが届くので、事前に対応方法を手順化しておくことを強くおすすめします。
外部共有先にメールが届いてしまうことも踏まえ、PowerShellを使った一括招待については、本記事のスコープ外として取り扱いません。
もし、PowerShellを使った一括招待を実施されたい方は下記を参照してください。
注意点
Entra B2Bゲストについて、下記の制約や注意点があるのであわせてまとめています。
- 外部共有先がExchange Onlineの共有メールボックスの場合、ゲスト招待してもログインできない
- 外部共有先がEntra IDアカウントの場合、自社テナントではUPNが#EXT#形式になりますが、認証は相手のテナントに移譲されます
- 外部共有先がEntra IDアカウントを持っているものの、Microsoft 365以外のメールシステムを使っている場合、招待メールが届かない場合があります。その際はMicrosoft Entra管理センター(https://entra.microsoft.com)から手動で招待する必要があります
- 外部共有先が同一のメールアドレス/UPNで個人のMicrosoftアカウントと組織アカウントを持っている場合、招待受諾時にどちらで受諾するか選択が求められます(組織アカウントで利用できない物があり、UPN(=社用メールアドレス)で個人アカウントを作成しているケースがたまにあります)
条件付きアクセスと監査ログ
作成されたEntra B2Bゲストアカウントは、他のMicrosoft Entraユーザー同様に条件付きアクセスの対象になります。
そのため、すでにゲストアカウントをスコープとして条件付きアクセスポリシーが設定されている場合は注意が必要です。
また、SPO OTPとは違ってゲストアカウントの認証ログはMicrosoft Entra IDのサインインログに集約されるので、監査対応時などは注意が必要です。
【重要】Entra B2Bゲスト運用時のセキュリティ上の注意点
よくある質問として、Microsoft Entra IDのエンタープライズアプリケーションの「プロパティ」で「割り当てが必要ですか?」を「いいえ」に設定している場合、Entra B2Bゲストもアクセスできるのでは?、が挙げられます。
残念ながら基本的にEntra B2Bゲストもサインインできてしまうので、例えばSAML/OIDCで連携済みアプリでJITプロビジョニング(ジャストタイムプロビジョニング)が利用できる場合、管理者が意図しないユーザーアカウントが作成される恐れもあります。
ただ一概にアクセスできるというわけではなく、下記のようなパターンであれば利用できない「こともあります」。
一例をあげると、External Identities→外部コラボレーションの設定内にある「ゲストユーザーのアクセス」がデフォルト値の「ゲスト ユーザーは、ディレクトリ オブジェクトのプロパティとメンバーシップへのアクセスが制限されます」になっている場合。
そのうえで、SAML/OIDC連携済みアプリでグループ情報などをもとに権限を設定している場合はサインインできないこともありますが、100%とは言い切れません。
「割り当てが必要ですか?」を「いいえ」に設定しているケースは、認証認可のワークフローを簡略化するために設定しているものかと思いますが、あまり良しとは言えないので、「ユーザーとグループ」で割り当てを行い、「割り当てが必要ですか?」を「はい」に設定することを強く推奨します。

どうしてもEntra B2Bゲストを除く全ユーザーを認可したいのであれば、Microsoft Entra IDグループで動的ユーザーグループを作成し、クエリに「(user.userType -eq “Member”)」を指定したグループを作成して割り当てるなどで回避してみてください。
