Microsoft 365

Teamsの古いチームを自動削除~Microsoft 365グループ有効期限をうまく活用する~ ②

こんにちは。

 Microsoft365 Advent Calendar 2022の4日目の記事になります。よろしくお願いします。

前回、以下のような記事を書いてみたのですが、今回は自動化実装のお話になります。

Azure AD Premium P1 ライセンスを所有している場合に利用が可能となるMicrosoft 365グループの有効期限ポリシーを使ってTeamsの古いチームを自動的に削除することが可能なのですが、この機能はあくまでMicrosoft 365グループに対して適用するポリシーなので、Teamsチーム以外にもSharePointなど、他サービスにも影響が出てしまうことをお話しておりました。

今回はMicrosoft社の機能範囲であまりコストがかけられないというニーズに対し、考えてみた内容になるのでもちろん予算があれば、他社様の素晴らしいサービスを導入してもよいと思います。あくまで参考程度にしてもらえますと幸いです。

実装概要

今回実装する方法ですが、簡単に言うとすべてのMicrosoft 365グループの有効期限をチェックして定義した期間を過ぎている場合は、期限リセットコマンドを実行するというシンプルなものです。

ただし、今回Microsoft 365グループ有効期限ポリシーの対象としたいのは、Teamsチームなので、チームと紐づいているMicrosoft 365グループは対象外にする必要があります。

Microsoft Graph PowerShellの準備

まずはMicrosoft 365グループの情報を取得するために、Microsoft Graph PowerShellのインストールを行います。その後、自動で実行できるようにサービスプリンシパルの登録などを行います。

このあたりの情報は以下Microsoft社のサポートブログにも掲載されているのでこちらを参考にしてください。

MicrosoftTeams PowerShell モジュールの準備

では次に、チームと紐づいているMicrosoft365グループを対象外にすべく、チームリストを取得してMicrosoft 365グループと紐づいていないかをチェックします。
そのためにMicrosoftTeams PowerShell モジュールをインストールします。

これでConnect-Microsoft Teamsが利用できるようになります。

さてさて、当然Connect-Microsoft Teamsも自動で実行できるようにしないといけません。
ついでに言えば、MSGraphで設定したサービスプリンシパルをそのまま利用できればうれしいところです。

2022年12月時点ではありますが、MicrosoftTeams PowerShell によるアプリケーションベースでの認証はバージョン 4.7.1-preview版でサポートされているという情報がありました。

Teams PowerShell モジュールでのアプリケーション ベースの認証

アプリケーション ベースの認証は、バージョン 4.7.1-preview 以降の Teams PowerShell モジュールでサポートされるようになりました。
現在、この認証モードは商用環境でのみサポートされています

したがって、以下コマンドにてプレビュー版(最新バージョン)をインストールする必要があります。

Install-Module -Name MicrosoftTeams –AllowPrerelease

もし、AllowPrerelease が利用できないようなメッセージが表示された場合は、以下のコマンドを使ってPowershellGetモジュールを最新にしてみましょう。

Install-Module PowerShellGet -Scope CurrentUser -Force -AllowClobber

上記インストール後、一度コンソールを閉じればもう一度MicrosoftTeams –AllowPrereleaseを実行してみてください。

スクリプトの準備

続いてはスクリプトの準備です。
最初に言っておくと、私はPowerShell含めてプログラミングが全く得意ではないので突っ込みどころ満載かと思います。
導入の際にご自身でカスタマイズしてご利用ください。

######事前準備######################### 
$ClientId = "サービスプリンシパルのアプリケーションIDを入れる"
$CertificateThumbprint = "証明書の拇印を入れる"
$TenantID = "AzurADのテナントIDを入れる"

$folder =  "C:\work\Microsoft365grouptest\"  
$filename = Get-Date -Format "yyyy-MMdd-HHmm"   
[string]$txtFile1 = "Microsoft365GroupExtensionResult_" + $filename + ".txt"   
[string]$txtFile2 = "Microsoft365Not_ExtensionResult_" + $filename + ".txt"  
[string]$txtPath1 = Join-Path $folder $txtFile1  
[string]$txtPath2 = Join-Path $folder $txtFile2 
$TargetGroup= @()
#############################################

######延長を行う条件となる期間(期限の何日前に?)###### 
$AddDay = 100
$ExpirationDate =  (Get-Date).AddDays($AddDay)  
######################################################## 

#Connect to MgGraph   
Connect-MgGraph -Clientid $ClientId -TenantId $TenantID -CertificateThumbprint $CertificateThumbprint 
 
#Connect to Microsoft Teams 
Connect-MicrosoftTeams -CertificateThumbprint $CertificateThumbprint -ApplicationId $ClientId -TenantId $TenantID 
 
#グループ情報の取得 
$ExtensionGroupList = Get-MgGroup -all | where-object{$_.GroupTypes -like "Unified"}  
 
#Teamsのチーム一覧の取得 
$TeamsList = Get-team 
 
#有効期限がAddDayを切ったグループを TargetGroupに格納
foreach($ExtensionTargetGroup in $ExtensionGroupList){ 
 if($ExtensionTargetGroup.ExpirationDateTime -lt $ExpirationDate) 
 { 
$TargetGroup += $ExtensionTargetGroup 
 } 
 else{ 
#対象外のグループをテキストに出力
Write-Output ($ExtensionTargetGroup.DisplayName + "は対象外です。") | Out-File $txtPath2 -Encoding default -Append 
   } 
} 

#上述でTargetGroupに格納されたグループのIDがTeamsのチームリストに含まれていないものに対してリセットコマンド実行
foreach($TargetM365Group in $TargetGroup){ 
 if(-! $TeamsList.GroupId.Contains($TargetM365Group.Id)) 
 { 
#対象のグループをテキストに出力
Write-Output ($TargetM365Group.DisplayName + "に対して設定します。") | Out-File $txtPath1 -Encoding default -Append 

#リセットコマンド実行
Invoke-MgRenewGroup -GroupId $TargetM365Group.Id -PassThru  
 }
 
else{
#対象外のグループをテキストに出力
Write-Output ($TargetM365Group.DisplayName + "は対象外です。") | Out-File $txtPath2 -Encoding default -Append
  }
} 
Remove-Variable TargetGroup 
Disconnect-MgGraph
Disconnect-MicrosoftTeams

条件分岐の部分に注目して補足すると、以下のようになるはずです。

上記をps1ファイルにしてタスクスケジュールに仕込んで繰り返し実行すれば、定義した期限に近づいたTeamsのチーム以外のMicrosoft 365グループは本スクリプトでリセットコマンドが常に実行され、AzureADで設定した有効期限ポリシーはTeamsのチームのみに適用されることになります。

まとめ

いかがでしたでしょうか。
本スクリプトをご利用される場合は十分に検証してから自己責任にてお願いします。
また、長くに渡って導入実績がまだ無いことから、改善点などがあればぜひ問い合わせフォームからご連絡いただけると幸いです。

-Microsoft 365