共有メールボックス情報のエクスポート方法 | セキュリティG含むメンバー情報を出力するコマンドガイド

PowerShell

社内の共有メールボックスを整理するのに、全メールボックスのメンバー情報が知りたいな。

PowerShellコマンドで取得できるよ。
ぼくはチュールの製造メンバーが知りたいにゃ。

やりたいこと

テナント(組織内)に存在するすべての共有メールボックスについて、以下の情報を出力したい。
・表示名
・メールアドレス
・メンバーの表示名
・メンバーのUPN
※メンバーにセキュリティグループが含まれる場合は、そのグループの表示名とメールアドレスも出力したい。

前提

4つの共有メールボックスがあり、メンバー構成は以下のとおり。
「春_shared」のみ、「夏」というメールが有効なセキュリティグループをメンバーとして持っている。

共有メールボックス春_shared夏_shared秋_shared冬_shared
メンバーいちご
びわ
さくらんぼ
夏(セキュリティG)
メロン
すいか
もも 

なし
かき
ぶどう

みかん 
れもん 
りんご

コマンド

実行するには”Exchange管理者権限”が必要です。
以下のコマンドをPowerShellで実行。サインインを求められるので、Exchange管理者権限があるアカウントでサインインします。
出力先のパスファイル名は任意で。

Connect-ExchangeOnline -ShowProgress $true

# 共有メールボックスの情報取得
$SharedMailBoxes = Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize Unlimited |
                    Select-Object DisplayName, PrimarySmtpAddress

# 共有メールボックスのメンバーを取得
$SharedMailBoxAndMembers = @()

foreach ($SharedMailbox in $SharedMailBoxes) {
    $SharedMBXMembers = Get-MailboxPermission -Identity $SharedMailbox.PrimarySmtpAddress -ResultSize Unlimited |
                        Where-Object { $_.IsInherited -eq $false -and $_.User -ne 'NT AUTHORITY\SELF' } |
                        Select-Object @{Name='SharedMailBoxName'; Expression={$SharedMailbox.DisplayName}},
                                    @{Name='SharedMailBoxSmtpAddress'; Expression={$SharedMailbox.PrimarySmtpAddress}},
                                    User,
                                    AccessRights

    foreach ($member in $SharedMBXMembers) {
        # メンバーがユーザーの場合
        if ($member.User -like '*@*') {
            $memberObject = Get-Recipient $member.User
            $member | Add-Member -MemberType NoteProperty -Name DisplayName -Value $memberObject.DisplayName
            $member | Add-Member -MemberType NoteProperty -Name MemberType -Value "user"
            # User列はそのまま(UPNを保持)
        }
        # メンバーがセキュリティグループの場合
        else {
            $group = Get-DistributionGroup -Identity $member.User
            $member | Add-Member -MemberType NoteProperty -Name DisplayName -Value $group.DisplayName
            $member | Add-Member -MemberType NoteProperty -Name MemberType -Value "securityGroup"
            # User列をグループのSMTPアドレスで上書き
            $member.User = $group.PrimarySmtpAddress
        }
        $SharedMailBoxAndMembers += $member
    }
}

# 列の順序を指定してCSVファイルにエクスポート
$CsvFileName = "SharedMailBoxAndMembers_$(Get-Date -Format 'yyyyMMddHHmm').csv"
$SharedMailBoxAndMembers | 
    Select-Object SharedMailBoxName, SharedMailBoxSmtpAddress, DisplayName, User, MemberType, AccessRights |
    Export-Csv -Path (Join-Path "C:\temp" $CsvFileName) -NoTypeInformation -Encoding UTF8

実行結果

C:ドライブのtempフォルダに出力されました。
ファイル名に出力した日時も入っています。

出力されたcsvはこちら。
A列から順に、”共有メールボックスの表示名”、”共有メールボックスのメールアドレス”、”メンバーの表示名”、”メンバーのUPN”、”メンバーのタイプ(ユーザーかセキュリティGか)”、”アクセス権限”が格納されています。

「春_Shared」のメンバーである「夏(セキュリティG)」もちゃんと取得できています◎

ちなみに「FullAccess」というのは、Exchange管理センターではこちらに該当します。
今回のコマンドでは、フルアクセスを持つメンバーのみを取得しています。
※「春_Shared」の「メールボックス所有者として送信する」には、「夏(セキュリティG)」は含まれていません。

この権限(委任)の違いについてはまた別の記事にて…。

コメント

タイトルとURLをコピーしました