ハイブリッド(オンプレ AD 同期)テナントで「ユーザーにプロフィール写真を変えさせたくない」。この要件に最短で応える方法が、Microsoft Graph(Beta)の photoUpdateSettings を使った組織ポリシー化です。本記事は myaccount.microsoft.com を含むクラウド UI 側での変更を確実に止める設計、手順、落とし穴、ロールバックまで実運用レベルで解説します。
結論(先に要点だけ知りたい方向け)
| 項目 | 結論・解説 |
|---|---|
| 適用単位 | テナント全体のみ。グループ/個人ユーザー単位のスコープは現時点で不可。管理ロール(役割)で「誰が写真を変えられるか」を限定する設計になります。 |
| ハイブリッド同期テナント(オンプレ AD → Entra ID 同期) | PATCH /beta/admin/people/photoUpdateSettings に以下の JSON を適用します。{ "source": "onPremises", "allowedRoles": [] } source を onPremises にすると「オンプレから同期された写真のみ許可」となり、myaccount.microsoft.com/Teams/OWA 等のクラウド UI や API 経由の変更は全ブロック。 allowedRoles はクラウド更新用の許可ロールリスト。onPremises 指定時はクラウド側更新そのものが無効化されるため空配列で問題ありません。 |
| クラウド専用テナント | source に cloud を指定し、allowedRoles に許可する管理ロールの GUID を並べます(例:グローバル管理者・ユーザー管理者・People 管理者)。{ "source": "cloud", "allowedRoles": [ "62e90394-69f5-4237-9190-012177145e10", // Global Administrator "fe930be7-5e62-47db-91af-98c3a49a38b1", // User Administrator "024906de-61e5-49c8-8572-40335f1e0e10" // People Administrator ] } これにより、指定ロール以外は写真を変更できません。 |
| 反映と注意 | 反映まで最大 24 時間程度のラグが発生し得ます。トークンのキャッシュやアプリ側キャッシュも影響するため、テスト時はサインアウト/サインインや Web クライアントのシークレットウィンドウでの再検証が有効。既存のクラウド側写真はロックされるだけで自動削除はされません。 |
| ロールバック | 既定状態に戻すには DELETE /beta/admin/people/photoUpdateSettings を実行します(作成済みの photoUpdateSettings を削除)。 |
| Beta の留意点 | 本機能は Graph の Beta 版 API です。スキーマや挙動が将来変更される可能性に留意し、必ず検証環境で事前確認してください。 |
仕組みの概要:photoUpdateSettings で何を制御しているのか
/admin/people/photoUpdateSettings は、組織(テナント)単位で「プロフィール写真の更新をどこから・誰が行えるか」を統一的にコントロールするリソースです。Azure AD(現 Microsoft Entra ID)各サービスに散在していた部分的なブロック(例:OWA ポリシーなど)では myaccount.microsoft.com を止めきれないことがありましたが、photoUpdateSettings なら統一的に UI/API を抑止できます。
| プロパティ | 概要 | 主なポイント |
|---|---|---|
source | 更新の「発生源」を指定(cloud / onPremises)。 | cloud:クラウド UI/API からの更新を許可(既定では誰でも可)。 onPremises:オンプレ AD の thumbnailPhoto から同期のみ許可。クラウド UI/API 更新は全面停止。 |
allowedRoles | クラウド更新を許す管理ロールの GUID 配列(source=cloud のときのみ有効)。 | 代表例: Global Administrator(62e90394-69f5-4237-9190-012177145e10) User Administrator(fe930be7-5e62-47db-91af-98c3a49a38b1) People Administrator(024906de-61e5-49c8-8572-40335f1e0e10) 空配列で「誰でも」に見えがちですが、この挙動は source に依存します。— cloud かつ空配列:全ユーザーが更新可。— onPremises かつ空配列:クラウド更新自体が無効(よって誰もクラウド経由で変更不可)。 |
| 適用スコープ | テナント全体 | グループ/ユーザー単位のスコープ分割は不可。細かな制御は「誰ができるか(ロール)」で行う設計。 |
ハイブリッド環境で「クラウドからの変更を完全禁止」にする手順
前提条件
- Azure AD Connect または Cloud Sync でオンプレ AD の
thumbnailPhotoが同期される構成。 - Graph へのアクセス権:
PeopleSettings.ReadWrite.All(アプリ/委任いずれも可)。委任の場合は People Administrator など適切なロールが必要。 - テスト用ユーザーと検証ブラウザ(シークレットウィンドウ推奨)。
方法 A:Graph Explorer で設定(UI なしでも実行可)
- Graph Explorer にサインインし、バージョンを
betaに切り替え、許可PeopleSettings.ReadWrite.Allを付与。 GET https://graph.microsoft.com/beta/admin/people/photoUpdateSettingsを実行し、現在の設定を把握(404 の場合は未作成)。- 以下を PATCH 実行。
PATCH https://graph.microsoft.com/beta/admin/people/photoUpdateSettings Content-Type: application/json { "source": "onPremises", "allowedRoles": [] } - HTTP 200 が返れば成功。
GETで反映値を再確認。
方法 B:Graph PowerShell(推奨:自動化・再現性確保)
# 1) 必要モジュール(Beta)を推奨
Import-Module Microsoft.Graph.Beta.Identity.DirectoryManagement -ErrorAction Stop
# 2) 接続(委任:PeopleSettings.ReadWrite.All)
Connect-MgGraph -Scopes "PeopleSettings.ReadWrite.All"
# 3) 現状確認
Get-MgBetaAdminPeoplePhotoUpdateSetting
# 4) ハイブリッド方針に更新(クラウド変更を全面禁止)
$body = @{
source = "onPremises"
allowedRoles = @()
}
Update-MgBetaAdminPeoplePhotoUpdateSetting -BodyParameter $body
# 5) 再確認
Get-MgBetaAdminPeoplePhotoUpdateSetting | Format-List
反映確認(ユーザー体験)
- myaccount.microsoft.com でテストユーザーが写真変更を試みると、エラー表示・ボタン無効化等により更新できなくなります。
- Teams/OWA/SharePoint などの UI でもクラウド経由の変更はブロックされます。
- 反映ラグ(最大 24 時間)やアプリキャッシュの影響を考慮して、認証の更新(サインアウト/サインイン)で再確認してください。
運用:写真を更新したい場合(ハイブリッド)
- オンプレ AD の対象ユーザーに対し、
thumbnailPhoto属性を更新(100KB 前後・正方形推奨)。 - 同期の促進:
Start-ADSyncSyncCycle -PolicyType Delta。 - しばらくすると Microsoft 365 側に新しい写真が反映されます。削除したい場合は
thumbnailPhotoを空にして同期。
# 例:オンプレ AD で thumbnailPhoto を設定
# ※ 適切にリサイズ・圧縮した JPEG/PNG を用意
$user = "user01"
$photoBytes = [System.IO.File]::ReadAllBytes("C:\photos\user01.jpg")
Set-ADUser $user -Replace @{ thumbnailPhoto = $photoBytes }
# 同期を促進(AADC)
Start-ADSyncSyncCycle -PolicyType Delta
補足:オンプレ AD の thumbnailPhoto はサイズ制限が厳しめです。大きな画像は事前にリサイズ・圧縮してください。クラウド API(/users/{id}/photo/$value)は 4 MB まで受け付けますが、本構成ではクラウド側更新は無効化されています。
クラウド専用テナント:管理者だけ変更できるようにする
クラウド運用の場合は source を cloud にした上で、allowedRoles に許可ロール(GUID)を列挙します。少なくとも People Administrator を中心に、運用体制に応じて Global Administrator や User Administrator を追加します。
PATCH https://graph.microsoft.com/beta/admin/people/photoUpdateSettings
Content-Type: application/json
{
"source": "cloud",
"allowedRoles": [
"024906de-61e5-49c8-8572-40335f1e0e10", // People Administrator(最小権限原則に合致)
"62e90394-69f5-4237-9190-012177145e10", // Global Administrator(必要なら)
"fe930be7-5e62-47db-91af-98c3a49a38b1" // User Administrator(必要なら)
]
}
注意: allowedRoles に列挙されていないロール保持者や一般ユーザーは、myaccount.microsoft.com を含むクラウド UI/API から写真を変更できません。特定の管理者だけに作業を委任したいときは、Privileged Identity Management(PIM)と組み合わせて JIT(Just-In-Time)昇格を用いると監査・ガバナンス観点で堅牢です。
よくある質問(FAQ)
Q. グループ単位やユーザー単位で適用できますか?
A. できません。photoUpdateSettings はテナント全体で 1 つの方針を表すリソースです。粒度は「誰が(どの管理ロールが)」という観点でのみ調整します。
Q. 「完全禁止(オンプレでも不可)」は可能ですか?
A. いいえ。ハイブリッドで source=onPremises を選んだ場合、方針は「オンプレ同期のみ許可」です。よってクラウド経由は全面禁止できますが、オンプレ AD の更新自体を止める機能ではありません。組織のポリシーや運用で統制してください。
Q. OWA の Set-OwaMailboxPolicy -SetPhotoEnabled:$false と何が違いますか?
A. OWA ポリシーはあくまで Exchange Online(OWA)クライアントの UI を抑止するだけで、myaccount.microsoft.com や他の更新経路(Teams 等)を網羅できません。photoUpdateSettings は組織横断でクラウド更新の可否を統一的に制御できます。
Q. 反映に時間がかかるのはなぜ?
A. バックエンドの構成伝播(おおむね最大 24 時間)とクライアント側キャッシュが要因です。検証時はトークン更新(サインアウト/サインイン)やプライベートウィンドウ、Teams のサインアウトなどを併用しましょう。
Q. どのロール GUID を入れればいいですか?
| ロール名 | GUID(テンプレート ID) | 用途の目安 |
|---|---|---|
| People Administrator | 024906de-61e5-49c8-8572-40335f1e0e10 | プロフィール写真・People 設定の最小権限運用に最適 |
| Global Administrator | 62e90394-69f5-4237-9190-012177145e10 | ブレークグラスや例外対応で許可したい場合のみ追加 |
| User Administrator | fe930be7-5e62-47db-91af-98c3a49a38b1 | ユーザー運用部門が写真も扱う場合に検討 |
補足: GUID はテナント共通のロールテンプレート ID です。PowerShell の Get-MgDirectoryRoleTemplate 等で確認できます。
ロールバック(既定に戻す)
方針をいったん解除して既定状態に戻したい場合は、DELETE を実行します。
DELETE https://graph.microsoft.com/beta/admin/people/photoUpdateSettings
PowerShell(Beta モジュール)の例:
Connect-MgGraph -Scopes "PeopleSettings.ReadWrite.All"
Remove-MgBetaAdminPeoplePhotoUpdateSetting
削除後は GET で存在しない(404)か、再生成された既定が返ることを確認してください。
実装チェックリスト(変更前・変更後)
| 観点 | 変更前に確認 | 変更後に確認 |
|---|---|---|
| 影響範囲 | テナント全体で方針が変わることを関係者に周知 | 対象ユーザー全体でクラウド UI から更新できないことを確認 |
| 権限 | PeopleSettings.ReadWrite.All の同意と実行アカウントのロール | 必要最小限のロールだけが更新できること(source=cloud 運用時) |
| オンプレ同期 | thumbnailPhoto の同期が AADC/Cloud Sync で有効か | オンプレ更新→クラウド反映の経路が期待通りに機能するか |
| キャッシュ/伝播 | 検証計画に伝播ラグ(最大 24 時間)を織り込む | サインアウト/サインインやシークレットウィンドウで UI 反映を再確認 |
| 運用手順 | 写真更新申請~オンプレ更新~同期~通知のランブック整備 | 失敗時の切り戻し(DELETE)と監査ログの取得手順 |
トラブルシューティング
| 症状 | 考えられる原因 | 対処 |
|---|---|---|
| PATCH/DELETE が 403(Forbidden) | 必要なスコープやロール不足(PeopleSettings.ReadWrite.All/People Administrator 等) | スコープ同意とロールを付与して再試行。委任なら昇格(PIM)状態を確認。 |
| GET が 404(Not Found) | まだ photoUpdateSettings が作成されていない | PATCH(または POST)で初期作成し、その後 GET で確認。 |
| ユーザー側 UI でまだ変更できてしまう | 伝播ラグ/トークン・アプリキャッシュ | サインアウトやプライベートウィンドウで再検証。24 時間程度待機してから再確認。 |
| オンプレ更新が M365 に反映されない | thumbnailPhoto 未同期、サイズ超過、同期失敗 | 同期ルール・属性サイズ・同期エラーを確認。必要なら Start-ADSyncSyncCycle。 |
セキュリティとガバナンスのベストプラクティス
- 最小権限設計:クラウド運用で管理者のみ許可する場合は、まず People Administrator を採用し、Global Administrator は非常用(ブレークグラス)に限定。
- PIM の活用:JIT 昇格で必要時のみロールを有効化。承認・監査証跡を残す。
- 監査:構成変更の記録(誰がいつ PATCH/DELETE したか)を定期的にエクスポートし、変更管理台帳に反映。
- 運用ランブック:写真差し替えの依頼フロー、画像ガイドライン(正方形・適切な解像度・過度な個人情報を含めない)を明文化。
- 段階展開:検証テナント→パイロット→全社の順に適用。新機能(Beta)である点に留意し、ローリングバック手順(
DELETE)を常に準備。
実務でそのまま使える PowerShell サンプル
以下は「現在設定の取得 → 目標状態の適用 → 結果検証 → 必要に応じてロールバック」を一括で行うサンプルです。CI/CD(ランブック)に組み込む際の雛形としてご利用ください。
#Requires -Modules Microsoft.Graph.Beta.Identity.DirectoryManagement
param(
[ValidateSet("HybridBlockCloud","CloudAdminsOnly","Rollback")]
[string]$Mode = "HybridBlockCloud"
)
Import-Module Microsoft.Graph.Beta.Identity.DirectoryManagement -ErrorAction Stop
Connect-MgGraph -Scopes "PeopleSettings.ReadWrite.All" | Out-Null
function Show-Current {
try {
$cur = Get-MgBetaAdminPeoplePhotoUpdateSetting -ErrorAction Stop
"Current settings:`n" + ($cur | ConvertTo-Json -Depth 5)
} catch {
"Current settings: NotFound (404) or not created yet."
}
}
Write-Host (Show-Current)
switch ($Mode) {
"HybridBlockCloud" {
$body = @{ source = "onPremises"; allowedRoles = @() }
Update-MgBetaAdminPeoplePhotoUpdateSetting -BodyParameter $body
}
"CloudAdminsOnly" {
$roles = @(
"024906de-61e5-49c8-8572-40335f1e0e10", # People Administrator
"62e90394-69f5-4237-9190-012177145e10", # Global Administrator (optional)
"fe930be7-5e62-47db-91af-98c3a49a38b1" # User Administrator (optional)
)
$body = @{ source = "cloud"; allowedRoles = $roles }
Update-MgBetaAdminPeoplePhotoUpdateSetting -BodyParameter $body
}
"Rollback" {
Remove-MgBetaAdminPeoplePhotoUpdateSetting -ErrorAction Stop
}
}
"--- After ---"
Write-Host (Show-Current)
まとめ
- グループ単位の制御は不可。テナント全体のみ。
- ハイブリッドでは
source: "onPremises"を設定し、クラウド経由の写真変更を完全ブロック(myaccount.microsoft.com を含む)。 - クラウド専用では
source: "cloud"とallowedRolesを組み合わせ、許可した管理ロールだけに更新を限定。 - ロールバックは DELETE で既定に戻せる。
- Beta のため本番反映は段階適用し、常に検証と切り戻し手順を用意。
付録:コマンド・エンドポイント早見表
| 目的 | HTTP | PowerShell(Beta) |
|---|---|---|
| 現在設定の取得 | GET /beta/admin/people/photoUpdateSettings | Get-MgBetaAdminPeoplePhotoUpdateSetting |
| ハイブリッド(クラウド変更禁止) | PATCH /beta/admin/people/photoUpdateSettings{"source":"onPremises","allowedRoles":[]} | Update-MgBetaAdminPeoplePhotoUpdateSetting -BodyParameter @{source="onPremises";allowedRoles=@()} |
| クラウド(管理者のみ許可) | PATCH /beta/admin/people/photoUpdateSettings{"source":"cloud","allowedRoles":["..."]} | Update-MgBetaAdminPeoplePhotoUpdateSetting -BodyParameter @{source="cloud";allowedRoles=@("...")} |
| ロールバック(既定へ) | DELETE /beta/admin/people/photoUpdateSettings | Remove-MgBetaAdminPeoplePhotoUpdateSetting |
注意事項(再掲)
- 本機能は Graph Beta です。将来の変更に備え、必ず検証環境での事前テスト・段階適用・監査を徹底してください。
- UI 上の表示(ボタン有効/無効や警告文言)はサービスごとに差異があります。実体はサーバー側でブロックされます。
- myaccount.microsoft.com 以外の変更経路(Teams/Delve/OWA など)も方針に従いますが、キャッシュ差で一時的に古い表示が残る場合があります。

コメント