Site cover image

🐧 きまぐれクラウド日記

NotionをヘッドレスCMSとして利用しています。 AzureとMirosoft 365 に関することを備忘録と頭の整理の為に書いていきます。

🐧 Exchange Online のグローバルアドレスリスト(GAL)を非表示にする


はじめに

Exchange Online ではGlobal Address List(以下、GAL)という組織内のすべてのメールが有効なオブジェクトが含まれているアドレス一覧がデフォルトで作成されます。

ユーザーからすると、GAL以外にもユーザーや会議室等のオブジェクトのアドレス一覧が連絡先から見ることが可能で便利な機能となっています。

Image in a image block

Web版のOutlookから連絡先を確認すると、デフォルトで社内ユーザーのメールアドレス等の様々なアドレス帳が作成されています。

管理者からすると、ユーザーに見せたくないメールアドレスもここから見ることが可能な状態となっています。

このアドレス帳を見るのを制限するということを今回は行います。


行うこと

Outlookで表示されるGALを非表示にします。

厳密に言うとGALを非表示にすることはできないので、空のGALをユーザーが見るように変更します。

空のGALを作成して、そのGALを使うポリシーを対象のユーザーに割り当てることで無理やり非表示にします。

以下の作業を行います。

  1. 役割の割り当て
  2. グローバルアドレスリスト作成
  3. アドレス帳ポリシー作成
  4. アドレス帳ポリシーをユーザーに割り当てる
  5. 確認
  6. ポリシーをテナント全体に適用
  7. ポリシーを既定に戻す

環境

  • Windows10
  • PowerShell 7
  • PowerShell Exchangeのモジュール

役割の割り当て

通常PowerShell で操作する際はグローバル管理者やExchange管理者で行えば権限が足りないと赤文字が出ることはないのですが、今回はしっかりと赤文字が出るので役割を付与します。

今回実行するコマンドのページのMicrosoft Learn に以下のように書いてあります。

Exchange Online で、このコマンドレットはアドレス一覧の役割でのみ使用できます。既定では、この役割は役割グループに割り当てられていません。 このコマンドレットを使用するには、アドレス一覧の役割を役割グループ (たとえば、組織の管理 役割グループ) に追加する必要があります。 詳細については、「役割グループへ役割を追加する」を参照してください。
参考:New-GlobalAddressList (ExchangePowerShell) | Microsoft Learn

なかなか分かりづらいですが、PowerShellで「Get-GlobalAddressList」等のコマンドを実行する際に、Exchange管理者やグローバル管理者でも、その権限、役割持っていないので付与してくださいと解釈します。

早速役割を付与していきます。

Image in a image block
  • Exchange 管理センターにアクセスします。
  • 左のナビゲーションから「役割」>「管理者の役割」を選択します。
  • 「役割グループを追加する」を選択します。

Image in a image block
  • 基本設定の画面で操作します。
  • 名前で任意の値を入力します。(例:Address Lists Manager)
  • 説明も任意の値を入力します。
  • 「次へ」を選択します。

Image in a image block
  • 「アクセス許可」の画面で操作します。
  • 「Address Lists」のロールを選択します。
  • 「次へ」を選択します。

Image in a image block
  • 「管理者割り当て」の画面で操作します。
  • 管理者となるユーザーを選択します。
  • 「次へ」を選択します。
  • 確認画面に遷移しますので、問題ないか確認します。
  • 問題がなければ「役割グループの追加」を選択します。

以上で役割の追加は終了です。

役割を割り当ててからすぐにPowerShellを実行してもエラーが出るため、少し待ちます。

反映までは環境によるので一概に言えないですが、私の場合は1時間程度で反映されました。


グローバルアドレスリストの設定変更

現在の設定確認

まずは、PowerShell からExchange Online に接続します。

# Exchange Online に接続する
Connect-ExchangeOnline

現在のグローバルアドレスリストを確認します。

# グローバルアドレスリストを表示する
Get-GlobalAddressList

この辺りは全く変更していないので、既定のGALのみ表示されます。

Name                        RecipientFilter
----                        ---------------
Default Global Address List ((Alias -ne $null) -and (((ObjectClass -eq 'user') -or (ObjectClass -eq 'contact') -or (ObjectClass -eq 'msExchSystemMailbox') -or (ObjectClass -eq 'msExchDynamicDistributionLi 
                            st') -or (ObjectClass -eq 'group') -or (ObjectClass -eq 'publicFolder'))))

既定のグローバル アドレス一覧という名前の GAL、Exchange Onlineで使用できる組み込みの GAL、および IsDefaultGlobalAddressList プロパティ値Trueを持つ唯一の GAL は変更できません。
参考:Exchange Online でグローバル アドレス一覧のプロパティを構成する | Microsoft Learn

既定のGALを非表示にしていきたいところですが、上記を読むと既定のGALは変更できないので別のアプローチで考えます。

ユーザーが表示および使用できるのは 1 つの GAL のみです。

参考:Exchange Online でグローバル アドレス一覧のプロパティを構成する | Microsoft Learn

新しい中身が空のGALを作成し、それを対象のユーザーに割り当てればGALの非表示にすることができそうです。


新しいGALを作成する

空のGALを新規で作成します。

後々アドレス帳ポリシーを作成する際に必要となる「アドレス帳リスト」「オフライン アドレス帳」も作成します。

# 空のグローバルアドレスリストを作成する
New-GlobalAddressList -Name "GlobalAddressList-Empty"

# アドレス帳リストを作成する
New-AddressList -Name "AddressList-Empty"

# オフライン アドレス帳を作成する
New-OfflineAddressBook -Name "OfflineAddressBook-Empty" -AddressLists "GlobalAddressList-Empty"

アドレス帳ポリシーを作成する

先ほど作成したGALを表示させるアドレス帳ポリシーを作成します。

デフォルトでアドレス帳は「なし」になっていて、なしの場合は既定のGALを表示するようになっています。

以下のコマンドを実行してアドレス帳ポリシーを作成します。

RoomListは必須ですが、今回はすべて空にしたいので「"AddressList-Empty"」を使用します。

項目
Name 作成するアドレス帳ポリシーの名前
GlobalAddressList このポリシーに割り当てるGAL
OfflineAddressBook このポリシーに割り当てるオフラインアドレス帳
AddressLists このポリシーに割り当てるアドレス帳リスト(複数可)
RoomList このポリシーに割り当てるルームリスト
# アドレス帳ポリシーを作成する
New-AddressBookPolicy -Name "AddressBookPolicy-Empty" `
-GlobalAddressList "GlobalAddressList-Empty" `
-OfflineAddressBook "OfflineAddressBook-Empty" `
-AddressLists "AddressList-Empty" `
-RoomList "AddressList-Empty"

成功すれば以下のように表示されます。

Name                    GlobalAddressList        AddressLists         OfflineAddressBook        RoomList
----                    -----------------        ------------         ------------------        --------
AddressBookPolicy-Empty \GlobalAddressList-Empty {\AddressList-Empty} \OfflineAddressBook-Empty \AddressList-Empty

ユーザーにアドレス帳ポリシーを割り当てる

ポリシーの割り当てはGUIでもPowerShellでも行えます。

両方の割り当て方を載せます。

管理センターからアドレス帳ポリシーを割り当てる

Image in a image block
  • Exchange 管理センターにアクセスします。
  • 左のナビゲーションから「受信者」>「メールボックス」を選択します。
  • ポリシーを割り当てる対象のユーザーを選択します。(画像は全選択しています。)
  • 「メールボックスポリシー」を選択します。

Image in a image block
  • 「アドレス帳ポリシー」で先程作成したものを選択します。
  • 「保存」を選択します。

反映まで5分要する場合があるみたいです。

PowerShellでアドレス帳ポリシーを割り当てる

Exchange Online に接続後、以下のコマンドを実行します。

# アドレス帳ポリシーを割り当てる
Set-Mailbox -Identity <対象のユーザー> -AddressBookPolicy <対象のアドレス帳ポリシー>

今回の値に合わせると以下のようになります。

# アドレス帳ポリシーを割り当てる
Set-Mailbox -Identity "[email protected]" -AddressBookPolicy "AddressBookPolicy-Empty"

作業終了したのでExchange Onlineから切断します。

# Exchange Online から切断する
Disconnect-ExchangeOnline -Confirm:$false

GALの確認

ポリシーを割り当てたユーザーのOutlookから連絡先を確認します。

Image in a image block

前まで存在していた既定のGALから先程作成した空のGALに切り替わっていることが確認できます。

無理やりですがGALを非表示にすることができました。


アドレス帳ポリシーの切り替え

アドレス帳ポリシーを切り替えることで、空のGALと既定のGALどちらを表示させるか切り替えることができます。

テナント内全体にポリシーを適用する方法と元に戻す方法の手順を紹介します。

ポリシーテナント全体に適用

テナント内のすべてのメールアドレスを取得して、対象のアドレス帳ポリシーを割り当てます。

Exchange Online に接続します。

# Exchange Online に接続する
Connect-ExchangeOnline

現在のどのアドレス帳ポリシーが割り当てられているか確認します。

# 現在のテナント内すべてのメールアドレスのアドレス帳ポリシーを確認する
Get-Mailbox -ResultSize Unlimited | Select-Object UserPrincipalName, AddressBookPolicy

何も割り当てられていない場合は以下のように「AddressBookPolicy」に何も入っていないです。。

UserPrincipalName                               AddressBookPolicy
-----------------                               -----------------
user01@example.com
user02@example.com
user03@example.com

テナント内のすべてのメールアドレスを取得します

# テナント内のすべてのメールアドレスを取得します
$allMailboxes = Get-Mailbox -ResultSize Unlimited

テナント内すべてのメールアドレスに空のGALを表示させるアドレス帳ポリシーを割り当てます。

# テナント内すべてのメールボックスにアドレス帳ポリシーを割り当てる
foreach ($m in $allMailboxes) {
    Set-Mailbox -Identity $m.UserPrincipalName `
    -AddressBookPolicy "AddressBookPolicy-Empty"
}

再び現在のアドレス帳ポリシーを確認します。

# 現在のテナント内すべてのメールアドレスのアドレス帳ポリシーを確認する
Get-Mailbox -ResultSize Unlimited | Select-Object UserPrincipalName, AddressBookPolicy

成功していれば、以下のように表示されます。

UserPrincipalName                               AddressBookPolicy
-----------------                               -----------------
user01@example.com                              AddressBookPolicy-Empty
user02@example.com                              AddressBookPolicy-Empty
user03@example.com                              AddressBookPolicy-Empty

ポリシーを既定に戻す

テナント内のすべてのメールアドレスを取得して、今のアドレス帳ポリシーを外すことで既定の状態に戻します。

Exchange Online に接続します。

# Exchange Online に接続する
Connect-ExchangeOnline

テナント内のすべてのメールアドレスを取得します。

# テナント内のすべてのメールアドレスを取得します
$allMailboxes = Get-Mailbox -ResultSize Unlimited

アドレス帳ポリシーを割り当て解除します。

# テナント内すべてのメールボックスのアドレス帳ポリシーを削除する
foreach ($m in $allMailboxes) {
    Set-Mailbox -Identity $m.UserPrincipalName `
    -AddressBookPolicy $null
}

現在の設定を確認します。

# 現在のテナント内すべてのメールアドレスのアドレス帳ポリシーを確認する
Get-Mailbox -ResultSize Unlimited | Select-Object UserPrincipalName, AddressBookPolicy

以下のように、「AddressBookPolicy」が空欄で表示されればポリシーの割り当て解除成功です。

UserPrincipalName                               AddressBookPolicy
-----------------                               -----------------
user01@example.com
user02@example.com
user03@example.com

最後に

GALはグローバルアドレスリストの頭文字を取ってきたものですので、「ゆうちゃみ」とか「みちょぱ」の方のギャルを想像していた方には申し訳ないです。

今回はGALを非表示にしましたが、本来は1つのテナントに2つの組織がある際にそれぞれ独立したGALを見せるための機能みたいです。

再び既定のGALを表示させたい場合は、アドレス帳ポリシーを「なし」にすれば可能です。

その他、カスタマイズしたGALを表示させること可能になります。


参考