Office 365(Microsoft 365)クロステナント同期ユーザーがGALに表示されない原因と解決策|Mail User化とPowerShell手順

Microsoft Entra のクロステナント同期で他テナントのユーザーを取り込めたのに、Exchange Online の GAL(グローバル アドレス一覧)には一部しか出ない――そんな「同期できているのに検索できない」状況は、実は設定ミスではなく設計上よく起こります。原因の考え方と、PowerShell で確実に表示させる手順をまとめます。

目次

現象:クロステナント同期したユーザーが GAL に表示されない

問い合わせで多い状況は次のとおりです。

  • Microsoft Entra(旧 Azure AD)でクロステナント同期を構成し、Tenant B のユーザーが Tenant A の Entra ID に「Member」として作成される
  • Entra 管理センターでは同期ユーザーが見える(サインインやグループ付与もできる)
  • しかし Tenant A のExchange Online の GAL(OWA のアドレス帳や People から確認)では、過去にゲスト(B2B)招待していたユーザーだけが表示され、今回新しく同期したユーザーが出てこない
  • 属性マッピングで userType = Member、showInAddressList = True にしているが改善しない

まず押さえるポイント:Entra の同期と Exchange のアドレス帳は別物

結論から言うと、Entra ID にユーザーが同期されただけでは GAL には載りません。GAL は「ユーザー一覧」ではなく、Exchange がメール送受信の宛先として扱える受信者(mail-enabled object)の一覧だからです。

観点Entra ID(ディレクトリ)Exchange Online(受信者/アドレス帳)
主目的認証・認可、アプリ割り当て、Teams などのID基盤メール宛先、アドレス帳、配布・ルーティング
代表オブジェクトUser(Member / Guest)Mailbox / Mail User / Mail Contact / Group など
「見える」基準テナントに存在するユーザーなら表示されるmail-enabled(メール宛先として有効)で、かつアドレス一覧に非表示でない
よく混同される属性showInAddressList などHiddenFromAddressListsEnabled(非表示)など Exchange の受信者属性

つまり、クロステナント同期で Tenant A に「Member ユーザー」が増えても、そのユーザーが Exchange から見てMail User / Mail Contact等になっていなければ、OWA の GAL に出てこないのは自然な挙動です。

なぜ「過去に招待したゲスト(B2B)」だけが GAL に出るのか

「ゲストは出るのに、同期した Member は出ない」という状況がややこしさの原因です。ポイントは、ゲスト(B2B)が置かれている“立ち位置”です。

項目ゲスト(B2B)クロステナント同期の Member
目的外部ユーザーを招待し、リソースへアクセスさせる別テナントのユーザーを自テナントの ID として複製し、アプリやポリシーを適用
メール的な扱い“外部宛先”として扱いやすく、結果的に連絡先として整うケースがある既定では Exchange 側で mail-enabled にならないため、宛先としては未整備になりやすい
表示されやすさ環境・過去の設定により GAL に見えることがある何もしない限り GAL に出ないことが多い

「半年前の検証テナントでは見えていた」というケースは、実際にはその時点でゲスト招待していた、もしくは別手順(手動連絡先作成やスクリプト)で mail-enabled 化されていた可能性が高い、という整理になります。

切り分け:いま “どこまで” 作られているかを確認する

対処に入る前に、Tenant A 側で対象ユーザーが Exchange からどう見えているかを確認します。ここで状態が分かると、原因のほとんどは説明できます。

確認ポイント確認場所期待する状態NG のときに起きること
ユーザーが Entra に存在するEntra 管理センターTenant A に Member として存在そもそも同期が未完了/対象外
Exchange の受信者として存在するEAC(受信者)/ PowerShellMailbox / Mail User / Mail Contact のいずれかGAL に表示されない
アドレス一覧に非表示でないPowerShell(受信者属性)HiddenFromAddressListsEnabled が False受信者は存在するが GAL に出ない
アドレス帳ポリシー/フィルターEAC / 既存運用対象が検索範囲に含まれる特定ユーザーだけ見えない

OWA と Outlook の違いも押さえる

確認はできれば OWA(Outlook on the web) で行うのがおすすめです。Outlook デスクトップはオフライン アドレス帳(OAB)やキャッシュの影響を受け、反映確認が遅れたり、端末差が出たりします。OWA で見えない場合は、基本的にサーバー側の受信者状態を疑います。

解決策A:PowerShell で “Mail User 化” して GAL に載せる(推奨)

人数が多い、または運用として継続的に取り込むなら、Exchange Online PowerShell で mail-enabled 化するのが現実的です。やることはシンプルで、「Entra に存在するユーザー」を Exchange の受信者として有効化し、外部メールアドレスを紐付けます。

この方法で実現できること

  • GAL に表示される(アドレス帳検索・名前解決ができる)
  • Tenant A から Tenant B のメールボックスへ、ユーザーを宛先として送信できる(ルーティングされる)
  • メールボックスを作らないため、Exchange ライセンスを追加せずに “宛先” だけ整備できる

前提:外部メールアドレスをどう決めるか

Mail User では「表示/検索されるアドレス(PrimarySmtpAddress 等)」と「実際の配送先(ExternalEmailAddress)」が分かれます。運用上は次の考え方が安全です。

設定項目意味おすすめの決め方
ExternalEmailAddress実配送先(外部)Tenant B のそのユーザーの主要メール(例:[email protected])
PrimarySmtpAddressアドレス帳上の代表アドレスTenant A の受信可能ドメイン内で一意になる値(例:[email protected])
表示名/別名検索性・重複回避組織の命名規則に合わせる(例:姓 名(会社名))

「宛先として送れればよい」だけなら、まずは ExternalEmailAddress を正しく入れることが最重要です。表示名や primary SMTP は後から整えられます。

単一ユーザーの最小コマンド例

Tenant A の Exchange 管理権限で接続し、同期済みユーザーを Mail User 化します。

Connect-ExchangeOnline -UserPrincipalName [email protected]

# Tenant A に作成された(クロステナント同期済み)ユーザーのID

$identity = "[[email protected]](mailto:[email protected])"

# Tenant B 側の実メールアドレス(配送先)

$external = "[[email protected]](mailto:[email protected])"

# Mail User 化(mail-enabled)

Enable-MailUser -Identity $identity -ExternalEmailAddress $external

# GAL 非表示を解除(必要な場合)

Set-MailUser -Identity $identity -HiddenFromAddressListsEnabled $false

実行後、EAC の「受信者」検索で Mail User として見えるようになれば、GAL 反映の条件はほぼ満たせています。

一括対応の考え方(CSV で管理する)

クロステナント同期の対象ユーザーは増減しやすいため、最初から「対象一覧(CSV)」を持っておくと運用が安定します。たとえば、次のような CSV を用意します。

# users.csv の例
Identity,ExternalEmailAddress,DisplayName
[email protected],[email protected],山田 太郎(TenantB)
[email protected],[email protected],鈴木 花子(TenantB)

CSV を読み込んで Mail User 化し、非表示フラグも揃える例です。

Connect-ExchangeOnline -UserPrincipalName [email protected]

$rows = Import-Csv .\users.csv

foreach ($r in $rows) {
try {
# すでに Mail User なら更新だけ、未作成なら有効化
$mu = Get-MailUser -Identity $r.Identity -ErrorAction SilentlyContinue


if (-not $mu) {
  Enable-MailUser -Identity $r.Identity -ExternalEmailAddress $r.ExternalEmailAddress
} else {
  Set-MailUser -Identity $r.Identity -ExternalEmailAddress $r.ExternalEmailAddress
}

# 表示名(任意)
if ($r.DisplayName) {
  Set-MailUser -Identity $r.Identity -DisplayName $r.DisplayName
}

# GAL 非表示の解除
Set-MailUser -Identity $r.Identity -HiddenFromAddressListsEnabled $false

Write-Host "OK:" $r.Identity


}
catch {
Write-Host "NG:" $r.Identity $_.Exception.Message
}
}

大量処理では「外部アドレスの重複」「既存連絡先との衝突」が起きやすいので、失敗時のメッセージをログに残し、個別に潰す運用が現実的です。

反映確認(“できたはず” を潰すチェック)

PowerShell で次の2点が確認できれば、GAL 反映の原因はほぼ切り分けできます。

確認内容コマンド例見るべきポイント
Mail User として存在するかGet-MailUser -Identity [email protected]結果が返る(存在する)
非表示になっていないか(Get-MailUser -Identity [email protected]).HiddenFromAddressListsEnabledFalse である
配送先が正しいか(Get-MailUser -Identity [email protected]).ExternalEmailAddressTenant B のメールになっている

OWA で表示されない場合でも、上記が揃っていれば「アドレス帳ポリシー」や「検索範囲」「表示側のキャッシュ」を疑うフェーズに入れます。

解決策B:EAC で Mail Contact を手動作成(少数向け)

PowerShell が使えない、または対象が数名だけなら、Tenant A に外部連絡先(Mail Contact)を作る方法でも GAL へ載せられます。ポイントは、これは “メール宛先を作る” だけであり、クロステナント同期の Member ユーザーとは別オブジェクトになり得る、という点です。

方式メリットデメリット向いているケース
Mail User(PowerShell 推奨)同期ユーザー自身を mail-enabled 化でき、ID と宛先が揃うPowerShell が必要。外部アドレス設計が必要人数が多い、今後増える、運用として回したい
Mail Contact(EAC 手動)GUI で完結。外部アドレスがそのまま見えやすいユーザー(Member)とは別管理になり、二重管理/重複の元数名だけ、短期の暫定対応

EAC での作成手順は環境でメニュー名が多少変わりますが、基本は「受信者」から「連絡先」を追加し、外部メールアドレスを設定します。作成後に “アドレス一覧に非表示” が有効になっていないかも必ず確認してください。

よくある落とし穴:設定は正しいのに出ない原因

Mail User / Mail Contact を作ったのに見えない場合は、次の落とし穴が多いです。

非表示フラグが有効になっている

Exchange の受信者には「アドレス一覧に非表示」が存在します。Entra の showInAddressList を True にしても、Exchange 側で非表示が True のままだと GAL には出ません。

Set-MailUser -Identity [email protected] -HiddenFromAddressListsEnabled $false

アドレス帳ポリシー(ABP)で検索範囲が分断されている

大企業テナントでは、部署ごとに “見える GAL” を分けるために Address Book Policy(ABP)を使っていることがあります。この場合、受信者としては存在していても、ユーザー側に割り当てられた ABP に対象のアドレス一覧が含まれていなければ表示されません。

  • 特定の人だけ見えない/部署によって見え方が違う
  • 同じ条件のはずなのに、管理者で見ると見える

この症状がある場合は ABP の有無を疑い、対象ユーザーのポリシー割り当てとアドレス一覧のフィルターを確認します。

既存の連絡先やゲストとアドレスが衝突している

過去のゲスト招待や外部連絡先作成が残っていると、同じメールアドレス(proxyAddresses)が既に使われていて Mail User 化に失敗することがあります。エラーが出た場合は、既存の受信者(Mail Contact / Mail User / Group)に同じアドレスが設定されていないかを調べます。

反映待ち・クライアントキャッシュで “出てないように見える”

OWA でも多少の反映遅延は起こり得ます。Outlook クライアントはさらに OAB やキャッシュが絡むため、次のような順で確認すると無駄が減ります。

確認手順意図
PowerShell で受信者が存在するか確認サーバー側の状態を確定させる
OWA で検索OAB 影響を避けて確認
Outlook(必要なら OAB 更新/再ダウンロード)端末依存の遅延を潰す

「以前は見えた」の整理:検証テナントとの差が出る理由

検証環境で見えていたのに本番で見えない場合、次の差分が典型です。

  • 検証ではゲスト招待(B2B)が混ざっていて、結果として連絡先相当が揃っていた
  • 検証では運用者が手動で外部連絡先を作っていた(気付かないまま “見える状態” を作っていた)
  • 本番では ABP や受信者フィルター、命名規則など “アドレス帳の運用制約” が存在する

クロステナント同期はあくまで「ID を複製してアクセス制御に使う」機能であり、Exchange の受信者作成まで自動で揃える仕組みが既定では用意されていない、という前提で設計すると迷いが減ります。

運用設計のコツ:増え続ける同期ユーザーを破綻させない

一度 Mail User 化を始めると、次に悩むのが「増減の追従」と「重複の防止」です。おすすめの設計パターンをまとめます。

公開対象を絞る(全同期ユーザーを必ずしも GAL に載せない)

クロステナント同期の対象が広いほど、GAL に載せる宛先も増え、検索性が落ちます。次のように“GAL に載せる人” を別基準で定義すると運用が安定します。

  • Tenant A で「公開用セキュリティグループ」を作り、そこに入ったユーザーだけ Mail User 化する
  • 部署/役割などの属性(例:department、companyName)で対象を決め、CSV を自動生成する

命名規則を決める(同姓同名・外部組織を区別する)

外部ユーザーを GAL に混ぜる場合、表示名が曖昧だと誤送信の原因になります。たとえば「(会社名)」や「(外部)」を付けるだけでも、運用トラブルが減ります。

削除/退職のライフサイクルもセットで考える

同期が外れたユーザーを放置すると、GAL に古い宛先が残ります。クロステナント同期のスコープから外れたタイミングで、Mail User を無効化または非表示にする運用を決めておくと安心です。

最終チェックリスト(迷ったらここだけ見ればOK)

チェックOK の条件代表コマンド/操作
同期ユーザーが Entra にいるTenant A に Member として存在Entra 管理センターで検索
Exchange の受信者になっているMailbox / Mail User / Mail Contact のどれかGet-MailUser / EAC 受信者
外部配送先が正しいExternalEmailAddress が Tenant B の実アドレスGet-MailUser | Select ExternalEmailAddress
非表示になっていないHiddenFromAddressListsEnabled = FalseSet-MailUser -HiddenFromAddressListsEnabled $false
OWA で検索できるPeople/アドレス帳でヒットOWA で確認
部署差がある場合ABP/フィルターに含まれるABP の有無を確認

クロステナント同期は「ID を揃える」強力な機能ですが、メールの宛先(GAL)まで自動で揃えるものではありません。mail-enabled 化(Mail User / Mail Contact)という一手間を設計に組み込むことで、今回の “同期できているのに GAL に出ない” 問題は、再現性をもって解消できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次