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(受信者)/ PowerShell | Mailbox / 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]).HiddenFromAddressListsEnabled | False である |
| 配送先が正しいか | (Get-MailUser -Identity [email protected]).ExternalEmailAddress | Tenant 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 = False | Set-MailUser -HiddenFromAddressListsEnabled $false |
| OWA で検索できる | People/アドレス帳でヒット | OWA で確認 |
| 部署差がある場合 | ABP/フィルターに含まれる | ABP の有無を確認 |
クロステナント同期は「ID を揃える」強力な機能ですが、メールの宛先(GAL)まで自動で揃えるものではありません。mail-enabled 化(Mail User / Mail Contact)という一手間を設計に組み込むことで、今回の “同期できているのに GAL に出ない” 問題は、再現性をもって解消できます。

コメント