Microsoft 365 グループの有効期限ポリシーの管理下にあるグループを報告する方法
Yammer コミュニティがグループの有効期限ポリシーの対象となるようになりました
についての読者の質問 Microsoft 365 グループの有効期限ポリシー 有効期限ポリシーの範囲内で一連のグループの次の更新日を報告するために書いたPowerShellコードをいくつか確認しました。この質問は、Microsoft 365 グループの有効期限ポリシーが Yammer によるグループをカバーし、必要に応じて非アクティブなグループを削除するかどうかを知るために、Yammer に関連していました。答えは「はい」です。マイクロソフトは昨年、ネットワークが Microsoft 365 ネイティブ モードで実行されているときに Yammer コミュニティによって使用される Microsoft 365 グループに対応するためにポリシー処理を更新しました。マイクロソフトは、MC324202 (本日公開) のグループ有効期限ポリシーによる Yammer コミュニティのカバレッジを確認しました。 Microsoft 365 ロードマップ項目 82186 また、このシナリオを扱い、一般提供は2022年1月に発生したと述べています。
2020 年に、Microsoft は Microsoft 365 グループの有効期限ポリシーの動作方法を変更し、自動更新を導入しました。バックグラウンドジョブは、グループ所有者にグループの更新を思い出させる電子メールで迷惑をかける代わりに、グループがアクティブである証拠を探します。証拠が存在する場合、Microsoft 365 はグループを自動的に更新します。残念ながら、限られたシグナルのセットが更新を支配します。
- SharePoint Online: ファイルを表示、編集、ダウンロード、移動、共有、またはアップロードします。
- Outlook: グループに参加したり、グループ メールボックス内のメッセージの読み取り/書き込みを行ったり、(OWA で) メッセージを好きにしたりします。
- チーム: Teams チャネルにアクセスします。
- Yammer: Yammer コミュニティ内の投稿、または Outlook で対話型メールを表示します。
1 人のグループ メンバーのみが Teams チャネルにアクセスしたり、Yammer コミュニティで投稿を表示したりした場合、グループがアクティブであるかどうかは議論の余地があります。Microsoft Graph は、ユーザーのアクティビティに関する幅広いシグナルを収集しており、上記のアクションよりもグループアクティビティを判断するためのより正確な方法があるはずです。グループとチームのアクティビティレポートは、グループアクティビティの独自の評価をコーディングする方法の例です。
いずれにせよ、Azure AD 管理センターを通じて、Yammer コミュニティによって使用される Microsoft 365 グループをグループの有効期限ポリシーに追加できるという答えは残っています (図 1)。

PowerShell を使用してポリシーにグループを追加することもできます。
グループの有効期限ポリシーは、選択したグループまたはテナント内のすべての Microsoft 365 グループに適用されます。ポリシーの対象となるグループのメンバーであるユーザーは、Azure AD Premium P1 ライセンスを持っている必要があります。
グループの有効期限を報告するための PowerShell コード
グループの有効期限を報告するコードを記述することは難しくありません。グループを次に更新する必要がある日付は、 有効期限 財産。唯一の複雑さは、グループが最後に更新された日時を見つけることです。このデータは、 Get-UnifiedGroup コマンドレットなので、 Get-AzureADMSGroup コマンドレット。日付の取得場所がわかったら、見つけたことを報告できます。
Write-Host "Finding Microsoft 365 Groups to check…" [array]$ExpirationPolicyGroups = (Get-UnifiedGroup -ResultSize Unlimited | ? {$_.ExpirationTime -ne $Null} | Select DisplayName, ExternalDirectoryObjectId, WhenCreated, ExpirationTime ) If (!($ExpirationPolicyGroups)) { Write-Host "No groups found subject to the expiration policy - exiting" ; break } Write-Host $ExpirationPolicyGroups.Count “groups found. Now checking expiration status.” $Report = [System.Collections.Generic.List[Object]]::new(); $Today = (Get-Date) ForEach ($G in $ExpirationPolicyGroups) { $Days = (New-TimeSpan -Start $G.WhenCreated -End $Today).Days # Age of group $LastRenewed = (Get-AzureADMSGroup -Id $G.ExternalDirectoryObjectId).RenewedDateTime $DaysLeft = (New-TimeSpan -Start $Today -End $G.ExpirationTime).Days $ReportLine = [PSCustomObject]@{ Group = $G.DisplayName Created = Get-Date($G.WhenCreated) -format g AgeinDays = $Days LastRenewed = Get-Date($LastRenewed) -format g NextRenewal = Get-Date($G.ExpirationTime) -format g DaysLeft = $DaysLeft} $Report.Add($ReportLine) } # End Foreach CLS;Write-Host "Total Microsoft 365 Groups covered by expiration policy:" $ExpirationPolicyGroups.Count Write-Host “” $Report | Sort DaysLeft | Select Group, @{n="Last Renewed"; e= {$_.LastRenewed}}, @{n="Next Renewal Due"; e={$_.NextRenewal}}, @{n="Days before Expiration"; e={$_.DaysLeft}} Total Microsoft 365 Groups covered by expiration policy: 74 Group Last Renewed Next Renewal Due Days before Expiration ----- ------------ ---------------- ---------------------- Potholers (Team) 02/02/2020 07:16 21/02/2022 07:16 13 Office 365 Questions 19/05/2017 11:12 14/03/2022 15:04 34 Corona Virus News 10/03/2020 21:56 30/03/2022 22:56 51 Contract Workers 12/03/2020 08:57 01/04/2022 09:57 52 Plastic Production (Team) 25/03/2020 08:48 14/04/2022 09:48 65
このコードは動作しますが、次の 2 つの注意点があります。
- Get-UnifiedGroup は高速コマンドレットではありません。数百のグループに対して実行しても問題ありませんが、その数が増えると、コマンドレットが処理するグループの詳細を取得するために必要な時間はますます長くなります。
- ザ Get-AzureADMSGroup コマンドレットは、2022 年末に Azure AD モジュールを廃止するというマイクロソフトの決定の影響を受けます。コマンドレットはその日付以降も引き続き実行されますが、いつ停止するかはわかりません。
速度とサポート性の両方に対する解決策は、Microsoft Graph API クエリを使用してグループの詳細を取得することです。
グラフを使用して Microsoft 365 グループを取得し、有効期限の詳細を報告する
基本的に、私たちがする必要があるのは、 Get-UnifiedGroup Graph API クエリを使用して、テナント内のグループのセットを返します。ボーナスは、クエリが最後に更新された時刻を返すため、 Get-AzureADMSGroup.
PowerShell からグラフ クエリを呼び出すすべてのスクリプトと同様に、スクリプトで使用されるクエリを実行するために必要なアクセス許可を保持するために、Azure AD に登録されているアプリケーションが必要です。この場合、必要なのは グループ.読み取り.すべて 許可。アクセストークンをセキュリティで保護した後、ラムダフィルターを使用してテナント内のグループのセットを取得できます。以下に示すコードは、関数 (グラフデータの取得) を実行して下さい 呼び出し – レストメソッド すべてのグループが取得されるまでデータとページを取得するコマンドレット。あなたはのコードを見ることができます グラフデータの取得 機能 このスクリプトで。
グループのセットを取得した後、グループ名、作成日、最終更新日、および有効期限を詳述したレポートを作成します。によって返されるデータの処理に使用されるコード Get-UnifiedGroup は、グラフクエリによって返されるプロパティ名を処理するように変更されています。
$uri = "https://graph.microsoft.com/beta/groups?`$filter=ExpirationDateTime ge 2014-01-01T00:00:00Z AND groupTypes/any(a:a eq 'unified')&`$count=true" [array]$Groups = Get-GraphData -AccessToken $Token -Uri $uri If (!($Groups)) { Write-Host "No groups found subject to the expiration policy - exiting" ; break } $Report = [System.Collections.Generic.List[Object]]::new(); $Today = (Get-Date) ForEach ($G in $Groups) { $Days = (New-TimeSpan -Start $G.CreatedDateTime -End $Today).Days # Age of group #$LastRenewed = $G.RenewedDateTime #$NextRenewalDue = $G.ExpirationDateTime $DaysLeft = (New-TimeSpan -Start $Today -End $G.ExpirationDateTime).Days $GroupsInPolicy++ $ReportLine = [PSCustomObject]@{ Group = $G.DisplayName Created = Get-Date($G.CreatedDateTime) -format g "Age in days" = $Days "Last renewed" = Get-Date($G.RenewedDateTime) -format g "Next renewal" = Get-Date($G.ExpirationDateTime) -format g "Days before expiration" = $DaysLeft} $Report.Add($ReportLine) } # End ForeachCLS;Write-Host "Total Microsoft 365 Groups covered by expiration policy:" $Groups.Count Write-Host “” $Report | Sort "Days before expiration"| Select Group, "Last renewed", "Next renewal", "Days before expiration" | Out-GridView
ご想像のとおり、物事ははるかに速く実行されます。グラフ クエリによるデータの取得は、PowerShell コマンドレットを使用して Get-AzureADMSGroup 各グループは、物事をさらにスピードアップするのに役立ちます。図 2 に出力を示します。

別のアプローチは、 Get-UnifiedGroup そして Get-AzureADMSGroup と Get-MgGroup Microsoft Graph PowerShell SDK からのコマンドレット。グラフ API を使用するのとほぼ同じ速さのコードを次に示します。
Write-Host "Finding Microsoft 365 Groups to check…" [array]$ExpirationPolicyGroups = Get-MgGroup -Filter "groupTypes/any(c:c eq 'unified')" -All | ? {$_.ExpirationDateTime -ne $Null } If (!($ExpirationPolicyGroups)) { Write-Host "No groups found subject to the expiration policy - exiting" ; break } Write-Host $ExpirationPolicyGroups.Count “groups found. Now checking expiration status.” $Report = [System.Collections.Generic.List[Object]]::new(); $Today = (Get-Date) ForEach ($G in $ExpirationPolicyGroups) { $Days = (New-TimeSpan -Start $G.CreatedDateTime -End $Today).Days # Age of group $DaysLeft = (New-TimeSpan -Start $Today -End $G.ExpirationDateTime).Days $ReportLine = [PSCustomObject]@{ Group = $G.DisplayName Created = Get-Date($G.CreatedDateTime) -format g AgeinDays = $Days LastRenewed = Get-Date($G.RenewedDateTime) -format g NextRenewal = Get-Date($G.ExpirationDateTime) -format g DaysLeft = $DaysLeft} $Report.Add($ReportLine) } # End Foreach CLS;Write-Host "Total Microsoft 365 Groups covered by expiration policy:" $ExpirationPolicyGroups.Count Write-Host “” $Report | Sort DaysLeft | Select Group, @{n="Last Renewed"; e= {$_.LastRenewed}}, @{n="Next Renewal Due"; e={$_.NextRenewal}}, @{n="Days before Expiration"; e={$_.DaysLeft}}
クエリの高速化
Yammer コミュニティに関する質問により、コードを見て、来年 6 月に非推奨になる前にコマンドレットを置き換える必要があるインスタンスを見つける必要がありました。同時に、Graph クエリを導入することでコードを高速化できました。物事はうまくいったが、古いスクリプトを継続的にチェックして更新する必要性を示している。
Microsoft 365 テナント管理者が利用できるデータを活用する方法については、 Office 365 for IT プロフェッショナル 電子ブック。私たちは物事がどのように機能するかを理解するのが大好きです。
ディスカッション
コメント一覧
まだ、コメントがありません