Microsoft Teams で特定の部門だけにアプリの利用を許可したい、強制ピン止めを変更したいといった場合、アプリの「アクセス許可ポリシー」や「セットアップポリシー」をユーザーに割り当てる必要があります。
課や部単位でセキュリティグループを作成しており、例えば以下のような図でX事業部に共通のポリシーを割り当てたいとします。
この場合、AzureADで「X事業部」のメンバーを取得すると「A課」と「B課」が該当します。さらに「A課」と「B課」のメンバーを取得するとようやく今回ポリシーを取得すべきユーザー(User1さん、User2さん、User3さん、User4さん)が取得できます。
このような入れ子になっているセキュリティグループに対して、メンバー全員にポリシーを割り当てるPowerShellスクリプトを作成したのでご利用いただければと思います。
#対象のセキュリティグループと適用するポリシー
#適宜変更するか引数指定にしてください。
$secGroup="X事業部"
$permissionPolicyName="Japan permission"
$setupPolicyName="Japan setup"
#
#AzureAD/Teams モジュールのインポートと接続
#
Import-Module azuread
Import-Module MicrosoftTeams
$c = Get-Credential
Connect-AzureAD -credential $c
Connect-MicrosoftTeams -credential $c
#
#前回適用されたポリシーの削除(Globalに戻す)
#
$oldList =(Get-Content ".\current.txt") -as [string[]]
foreach($old in $oldList)
{
Grant-CsTeamsAppPermissionPolicy -identity $old -PolicyName global
Grant-CsTeamsAppSetupPolicy -identity $old -PolicyName global
Write-Host "$old さんのポリシーを削除しました"
}
#
#配列の初期化
#
$global:list=@()
#
#再帰呼び出し関数の定義
#
function getMemberList($mems){
foreach($member in $mems)
{
if($member.SecurityEnabled -eq "true")
{
$ms = Get-AzureADGroupMember -All 1 -ObjectId $member.ObjectId
getMemberList($ms)
}
else
{
$global:list += $member.UserPrincipalName
}
}
}
#
# ここからメイン処理/対象のセキュリティグループを取得し関数を呼び出す
#
$members = Get-AzureADGroup -Filter "DisplayName eq '$secGroup'" | Get-AzureADGroupMember -All 1
getMemberList($members)
#
# 作成されたユーザー一覧に対してそれぞれポリシーの割り当て
#
foreach($upn in $global:list)
{
Grant-CsTeamsAppPermissionPolicy -identity $upn -PolicyName $permissionPolicyName
Grant-CsTeamsAppSetupPolicy -identity $upn -PolicyName $setupPolicyName
Write-Host "$upn さんのポリシーを適用しました"
}
#
# 次回実行時に一度ポリシーを削除するためリストを保存
#
$global:list | Set-Content -Path ".\current.txt"
解説
このスクリプトは再帰構造になっています。
あるセキュリティグループのメンバーを一つずつ確認し、そのメンバーがユーザーならばリストにそのユーザーのメールアドレスを追加します。
セキュリティグループならば、自分自身を呼び出して、メンバーを一つずつ確認して、そのメンバーがユーザーならばアドレスを追加します。
セキュリティグループならば(セキュリティグループ内のセキュリティーグループなら)さらに自分自身を呼び出して…と繰り返します。
(追記)途中でセキュリティグループから抜けたユーザーのポリシーを戻すため、実行終了後に対象ユーザーの一覧を保存し、次回実行時にいったんポリシーを削除するという処理を追加しました。
(追記)IdentityとしてMailよりUserPrincipalNameのほうが適切と思われるため修正しました。
注意事項
- 事前にPowerShellを管理者として実行し、以下を実行しモジュールをインストールしておきます。
Install-Module AzureAD
Install-Module MicrosoftTeams -SkipPublishCheck - セキュリティグループの中に配布グループが…といったようなややこしい構造になっている場合、if 文を変更してご利用ください。
- ポリシーを変更するということはある程度リスクを伴いますので、実行の際はご注意ください。