ヘッダー画像

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-UnifiedGroupLinksMicrosoft365グループのメンバー追加
Remove-UnifiedGroupLinksMicrosoft365グループのメンバー削除
Compare-Objectメールが有効なセキュリティグループのメンバーとMicrosoft365グループのメンバー差分を出力
Get-DistributionGroupMemberメールが有効なセキュリティグループのメンバーを出力
Get-UnifiedGroupLinksMicrosoft365グループのメンバーを出力

それでは実際のソースコードを書いていきます。かなりこねこねしてますのでわかりにくい感じになってます。本プログラムの実行にはインプットファイルとしてMicrosoft365グループとメールが有効なセキュリティグループを紐づけするためのCSVファイルが別途必要になります。CSVファイルの仕様は下記の通りです。

項番ヘッダー詳細
1DistributionGroupNameActive Directoryで作成されたメールが有効なセキュリティグループのメールアドレスを記載します
2UnifiedGroupName紐づけするMicrosoft365グループのメールアドレスを記載します。
Microsoft Public Affiliate Program (JP)(マイクロソフトアフィリエイトプログラム)

公開していた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で利用できるその他のグループ管理については別記事をご確認ください。