Microsoft365グループの管理手法を検討する
目次
はじめに
メーリングリストとしても権限設定用としても利用できるハイブリッドなグループMicrosoft365グループですが、管理については悩ましいところがいっぱいです。一般的に導入されているAzure AD Connectを使った同期や3rdパーティ製のSSOツールを使った同期は、配布グループやメールが有効なセキュリティグループは同期可能ですが、Microsoft365グループは作成できません。今回はMicrosoft365グループの管理手法について記載します。
考えられる管理方法
- Microsoft365管理センターまたはAzure ADで直接管理する
- ユーザの属性情報を基に、動的グループを使って管理する
- Powershellで実装する
- 3rdパーティ製品でこの手のメンテナンス系ツールを購入する
Microsoft365管理センターまたはAzure ADで直接管理する
この方法は、ユーザ数の少ない小規模な会社様では現実的な案となりえます。単純に管理画面上でぽちぽちしていただく運用になります。どなたでも対応していただける方法で、追加で費用も一切必要ありません。
ユーザの属性情報を基に、動的グループを使って管理する
この方法では、Microsoft365上に作成されるユーザの属性値に対して値を入れ、その値を基に指定されたMicrosoft365グループのメンバーとして自動登録される方法です。この方法を利用する場合、Microsoft365のライセンスとは別にAzure AD Premiumのライセンス契約が必要になります。
上記の方法であれば、費用は掛かりますが、オンプレミスのActive Directoryをメンテナンスするだけで、Microsoft365グループのメンバーメンテナンスまで実現できることがわかります。大規模な組織変更なども容易に対応できそうです。
Powershellで実装する
Azure AD Premiumなんて契約できるか(怒)という方向けにご案内します。費用をかけずにどうにかしようと思うとこんな形になります。一定のルールなしでは実装できませんので、ここでご紹介する方法は、すでに部署用のメーリングリストがメールが有効なセキュリティグループとして存在しており、そのグループメンバーはメンテナンスができていることを前提とします。また部署グループなので、その下の組織レベルが存在している場合でも対応が可能な形を想定します。
では早速、今回使うコマンドは下記の通りです。Compare-Objectでグループメンバーを比較して追加も削除も一気に対応する方針で行きます。Powershell 7.1以上で対応可能です。
コマンド | 用途 |
---|---|
Add-UnifiedGroupLinks | Microsoft365グループのメンバー追加 |
Remove-UnifiedGroupLinks | Microsoft365グループのメンバー削除 |
Compare-Object | メールが有効なセキュリティグループのメンバーとMicrosoft365グループのメンバー差分を出力 |
Get-DistributionGroupMember | メールが有効なセキュリティグループのメンバーを出力 |
Get-UnifiedGroupLinks | Microsoft365グループのメンバーを出力 |
それでは実際のソースコードを書いていきます。かなりこねこねしてますのでわかりにくい感じになってます。本プログラムの実行にはインプットファイルとしてMicrosoft365グループとメールが有効なセキュリティグループを紐づけするためのCSVファイルが別途必要になります。CSVファイルの仕様は下記の通りです。
項番 | ヘッダー | 詳細 |
---|---|---|
1 | DistributionGroupName | Active Directoryで作成されたメールが有効なセキュリティグループのメールアドレスを記載します |
2 | UnifiedGroupName | 紐づけするMicrosoft365グループのメールアドレスを記載します。 |
公開していたPowershellにバグがあることを発見したためプログラムを2021年5月9日に修正しております。大変申し訳ございません。修正内容は以下の通りです。
- Microsoft365グループのメンバーが0人だとエラーになってしまう不具合
- CSVを取り込んだ後のFor文の処理
- 上記に合わせて変数名変更
下記Powershellプログラムを2021年12月14日に修正しております。
#環境に合わせて値を修正してください $UserName = "管理者ID" $Passwd = "パスワード" $inputCSVPath = "C:\temp\GroupList.csv" #初期設定 $DistributionGroupMemberUsers = @() $Groupmembers =@() #接続設定 $CvtPass = ConvertTo-SecureString $Passwd -AsPlainText -Force $UserCredential = New-Object System.Management.Automation.PSCredential($UserName,$CvtPass) #Connect-ExchangeOnline -Credential $UserCredential #メールが有効なセキュリティグループのメンバー取得 function getDistributionGroupMember($mailAddress){ $DistributionGroupMembers = Get-DistributionGroupMember $mailAddress #グループかどうかを判定します。 foreach($DistribustionGroupMember in $DistributionGroupMembers.PrimarySmtpAddress){ try{ if((Get-DistributionGroup -Identity $DistribustionGroupMember -ErrorAction stop).RecipientType -like "MailUniversal*"){ #再起呼び出しを行います。 getDistributionGroupMember($DistribustionGroupMember) } }catch{ #メンバーがユーザの場合変数へ追加処理を行います。 $Groupmembers += [pscustomobject]@{PrimarySmtpAddress=$DistribustionGroupMember} } } return $Groupmembers } #CSVファイルからグループの紐づけを取得 if (Test-Path -Path $inputCSVPath){ $CSV = Import-Csv $inputCSVPath Foreach ($GroupNames in $CSV){ $DistributionGroupName = $GroupNames.DistributionGroupName $UnifiedGroupName = $GroupNames.UnifiedGroupName $DistributionGroupMemberUsers += getDistributionGroupMember($DistributionGroupName) #Microsoft365グループのメンバー取得 $unifiedGroupMember = Get-UnifiedGroupLinks -Identity $UnifiedGroupName -LinkType Member | Select PrimarySmtpAddress |Sort-Object PrimarySmtpAddress #メンバーの重複排除 $DistributionGroupMemberUsersUnique = $DistributionGroupMemberUsers | Sort-Object PrimarySmtpAddress -Unique #Microsoft365グループメンバーが空だった場合の処理 if ($unifiedGroupMember -eq $null ){ $DistributionGroupMemberUsersUnique | %{ Add-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Member } }else{ #メールが有効なセキュリティグループのメンバーとMicrosoft365グループのメンバーを比較 Compare-Object -ReferenceObject $DistributionGroupMemberUsersUnique -DifferenceObject $unifiedGroupMember -Property PrimarySmtpAddress | %{ if($_.SideIndicator -eq "=>"){ #削除されたメンバーの調整 try{ Remove-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Member -Confirm:$false -ErrorAction stop #ユーザがオーナーだった場合の処理 }catch{ if($_.Categoryinfo.Reason -eq "GroupOwnersCannotBeRemovedException"){ try{ Remove-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Owners -Confirm:$false -ErrorAction stop Remove-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Member -Confirm:$false -ErrorAction stop #オーナーが一人もいなくなってしまう場合の処理(強制的に管理者IDを指定) }catch{ if($_.Categoryinfo.Reason -eq "MinGroupOwnersCriteriaBreachedException"){ Add-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $UserName -LinkType Owners Remove-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Owners -Confirm:$false Remove-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Member -Confirm:$false }else{ continue } } }else{ continue } } }else{ #追加されたメンバーの調整 Add-UnifiedGroupLinks -Identity $UnifiedGroupName -Links $_.PrimarySmtpAddress -LinkType Member } } } $DistributionGroupMemberUsers = @() } }
まとめ
Teamsのチーム管理の大本であるMicrosoft365グループは、オンプレミスActive Directoryの情報をそのまま利用できる状態にありませんでした。さらにセキュリティグループや配布グループと違いグループネストの概念がなく、メンテナンスが煩雑になりがちです。
Teamsのチームは初期の作成だけをシステム管理者で代行し、後のメンバー管理はそれぞれのチームの代表者に委任していただくほうが良いかもしれません。後は3rdパーティ製品でこの辺りを自動化してくるツールを提供してる会社あるでしょうから探してみてください。本記事がシステム運用の一助となりましたら幸いです。
Microsoft365で利用できるその他のグループ管理については別記事をご確認ください。