Microsoft 365グループ・チームのゲスト招待可否設定をPowerShellで一覧出力する

Microsoft 365グループ(チームを含む)にはゲストユーザーを招待することができますが、組織としてゲストユーザーを招待して良いかどうかを明確に区別して利用する必要なケースもあるかと思います。

こういったニーズがある場合、ゲストユーザーを招待させたくないグループに対してはゲスト招待を不可とする設定を行います。*1

この設定値の確認や設定にはPowerShellコマンドが必須となります。そのため、棚卸などで組織内の全Microsoft 365グループの設定を一度に参照したい場合、コマンドを工夫する必要があります。

ゲスト招待許可設定を確認する

まず、特定のグループのゲスト招待許可設定を確認するコマンドです。

Azure AD(現Microsoft Entra)のコマンドであるため、ゲスト招待許可の実行前にConnect-AzureADを実行してください。

Connect-AzureAD

グループIDを引数に、Get-AzureADObjectSettingコマンドで特定のグループのゲスト招待許可設定の設定状態を確認します。

Get-AzureADObjectSetting -TargetObjectId [Microsoft 365グループのグループID] -TargetType Groups | fl Values;

コマンドの実行結果の返りは以下2通りあります。

パターン1:コマンド実行結果(実行結果なし)
パターン2:コマンド実行結果(実行結果あり)

このゲスト招待可否設定は、何も設定されていない状態が既定値であるため、既定値の場合は実行結果の返りがありません。ま、た既定値はゲスト招待が可能な状態を指します。

実行結果の返りがある場合(既定値から更新されている場合)は、AllowToAddGuestsがゲスト招待可否設定の項目名であり、Valueに出力された値が設定状態になります。

この既定値から、ゲスト招待を不可にする場合は値をFalseに設定します。

一度ゲスト招待不可にしたものを可にしたい、ゲスト招待を明示的に可としておきたい場合は、値をTrueに設定します。

※一度TrueまたはFalseにした後は、既定値(値が無い状態)には戻せません。

実行結果 設定状態
実行結果なし※既定値 ゲスト招待可
実行結果ありでValueがTrue ゲスト招待可
実行結果ありでValueがFalse ゲスト招待不可

全グループのゲスト招待許可設定を一覧化する

ゲスト招待可否設定の出力値は前述の通り、実行結果の返りが無い、もしくは1グループに対して複数行出力されます。

「1グループに対して複数行出力」というのが、組織内の全グループを一覧化して出力しようとしたときに少々厄介となります。

まずforeach構文を利用して、組織内のグループ数分Get-AzureADObjectSettingコマンドを繰り返し、全グループの設定値を取得してみます。

全グループを取得するGet-UnifiedGroupコマンドは、Exchange Onlineのコマンドであるため、Connect-ExchangeOnlineを実行します。

Connect-ExchangeOnline

組織内のグループ数分、Get-AzureADObjectSettingを実行してゲスト招待可否の値を取得します。

#組織内の全グループを取得する
$groups = Get-UnifiedGroup -ResultSize unlimited 
#グループごとに処理を繰り返す
foreach ($group in $groups) {
    #AllowToAddGuestsの値を取得する
    Get-AzureADObjectSetting -TargetObjectId  $group.ExternalDirectoryObjectId -TargetType Groups | fl Values;
}

実行結果は下記の通りです。

全グループの取得結果

このような形で、縦に並んで出力されます。表形式で出力されていれば一覧として見やすくなりますが、このままだと非常に見にくいです。

出力結果を加工して表形式で一覧出力する

では、取得した結果をそのまま出力するのではなく、取得した結果によって値を加工して表形式で出力されるようにします。

工夫した点としては以下です。

  • Get-AzureADObjectSettingを実行するごとに結果を出力するのではなく、$outputに取得結果を追加していって、最後に全量出力されるようにしました。
  • Get-AzureADObjectSettingの取得結果によって以下のような値の置き換えを行いました。
    • 取得結果に"False"の文字列が含まれる場合は「False」と出力する(※)
    • 取得結果に"True"の文字列が含まれる場合は「True」と出力する(※)
    • 実行結果に返りが無い場合(nullの場合)はブランクを出力する

※置き換えない場合、"Values:{calss SettingValue {(改行) Name: AllowToAddGuests(改行) Value: False/True}(改行)‥‥"と1レコードにつき複数行にわたって出力される

#組織内の全グループを取得する
$groups = Get-UnifiedGroup -ResultSize unlimited 
$output = @()
#グループごとに処理を繰り返す
foreach ($group in $groups) {
    #AllowToAddGuestsの値を取得する
    $groupSettings = Get-AzureADObjectSetting -TargetObjectId $group.ExternalDirectoryObjectId  -TargetType Groups 
    #AllowToAddGuestsの取得結果によって値を加工
    if ($groupSettings.Values -match "False") {
        $allowToAddGuests = $false #取得結果にFalseが含まれる場合は「False」と出力する
    } elseif ($groupSettings.Values -match "True") {
        $allowToAddGuests = $true #取得結果にTrueが含まれる場合は「True」と出力する
    } elseif ($groupSettings.Values -eq $null) {
        $allowToAddGuests = "" #実行結果に返りが無い場合(nullの場合)はブランクを出力する
    }
    $output += $allowToAddGuests
}
$output
実行結果

実行結果がリストとして出力されるようになりました。

一覧をCSVに出力する

今のままだとゲスト招待許可設定のみが出力され、どのグループの設定値であるかわからないため、グループを識別できる情報も一緒に出力されるようにします。

また、出力結果はCSVにエクスポートされるようにしました。

#組織内の全グループを取得する
$groups = Get-UnifiedGroup -ResultSize unlimited 
$output = @()
#グループごとに処理を繰り返す
foreach ($group in $groups) {
    #AllowToAddGuestsの値を取得する
    $groupID = $group.ExternalDirectoryObjectId
    $groupSettings = Get-AzureADObjectSetting -TargetObjectId $groupID  -TargetType Groups 
    #AllowToAddGuestsの取得結果によって値を加工
    if ($groupSettings.Values -match "False") {
        $allowToAddGuests = $false #取得結果にFalseが含まれる場合は「False」と出力する
    } elseif ($groupSettings.Values -match "True") {
        $allowToAddGuests = $true #取得結果にTrueが含まれる場合は「True」と出力する
    } elseif ($groupSettings.Values -eq $null) {
        $allowToAddGuests = "" #実行結果に返りが無い場合(nullの場合)はブランクを出力する
    }
    #リストに詰める
    $groupInfo = [PSCustomObject]@{
        "グループ名" = $group.DisplayName
        "グループID" = $groupID
        "ゲスト招待許可設定" = $allowToAddGuests 
    }
    $output += $groupInfo 
}
#CSVに出力する
$output | Export-Csv -Path (".\M365グループリスト_" + (Get-Date -Format yyyyMMdd_HHmmss) + ".csv") -Encoding UTF8 -NoTypeInformation

PowerShellで実行します。

PowerShell実行画面

出力されたCSVは、コマンドを実行したディレクトリに「M365グループリスト_yyyyMMdd_HHmmss.csv」のファイル名で出力されます。
※yyyyMMdd_HHmmss部分は実行年月日が入ります

CSVの出力フォルダ

CSVの「ゲスト招待許可設定」列に、各グループの設定状態が出力されます。

CSVの出力内容

なお上記では、取得結果になるべく近くなるように、ゲスト招待許可設定はTRUEやFALSEのように出力していますが、以下のような置き換えを行うと一覧としてより見やすくなります。

#組織内の全グループを取得する
$groups = Get-UnifiedGroup -ResultSize unlimited 
$output = @()
#グループごとに処理を繰り返す
foreach ($group in $groups) {
    #AllowToAddGuestsの値を取得する
    $groupID = $group.ExternalDirectoryObjectId
    $groupSettings = Get-AzureADObjectSetting -TargetObjectId $groupID  -TargetType Groups 
    #AllowToAddGuestsの取得結果によって値を加工
    if ($groupSettings.Values -match "False") {
        $allowToAddGuests = "不可" #取得結果にFalseが含まれる場合
    } elseif ($groupSettings.Values -match "True") {
        $allowToAddGuests = "可" #取得結果にTrueが含まれる場合
    } elseif ($groupSettings.Values -eq $null) {
        $allowToAddGuests = "可" #実行結果に返りが無い場合
    }
    #リストに詰める
    $groupInfo = [PSCustomObject]@{
        "グループ名" = $group.DisplayName
        "グループID" = $groupID
        "ゲスト招待許可設定" = $allowToAddGuests 
    }
    $output += $groupInfo 
}
#CSVに出力する
$output | Export-Csv -Path (".\M365グループリスト_" + (Get-Date -Format yyyyMMdd_HHmmss) + ".csv") -Encoding UTF8 -NoTypeInformation
CSVの出力内容

ゲスト招待許可設定が可か不可のどちらかで表示されるようになりました。「Trueとブランクがゲスト招待可能で、Falseはゲスト招待不可」という前提を知らない人でも理解できるリストになります。

終わりに

本記事では取得した値を加工して見やすくする方法を今回ご紹介しましたが、値を生のデータのままではなく加工しているということは「取得した値を改ざんしている」と紙一重とも言えます。

本記事の内容を活用いただく際は、取得したそのままの値を出しているわけではなく加工しているということを、認識頂いたうえでご利用ください。

また、出力される値の形式に仕様変更があった場合に、if文に使われている条件が当てはまらなくなることがあります。長期的にこのコマンドを使っていくのであれば、仕様変更に注意してメンテナンスしていくことが必要となります。

執筆担当者プロフィール
Hiroko, Kimura

Hiroko, Kimura(日本ビジネスシステムズ株式会社)

Microsoft 365製品の提案~運用が担当領域、特にTeams/Teams Phone多めです。趣味は音楽とテレビと映画。趣味にしたいのは筋トレ(エンジニアには筋肉が必要)。

担当記事一覧