2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Microsoft Teams]入れ子になったセキュリティグループでアプリポリシーを適用する

Last updated at Posted at 2022-05-25

Microsoft Teams で特定の部門だけにアプリの利用を許可したい、強制ピン止めを変更したいといった場合、アプリの「アクセス許可ポリシー」や「セットアップポリシー」をユーザーに割り当てる必要があります。

課や部単位でセキュリティグループを作成しており、例えば以下のような図でX事業部に共通のポリシーを割り当てたいとします。
image.png

この場合、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 文を変更してご利用ください。
  • ポリシーを変更するということはある程度リスクを伴いますので、実行の際はご注意ください。
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?