ささみ学習帳 - sasami's study book

ささみ学習帳

Microsoft365 や Power Platform について学んだこと・アイデアのメモ

【Microsoft 365 管理者向け】テナント内のExchange会議室・備品リソースの利用状況を取得するPowershellスクリプトを作ってみた

この記事は「Microsoft 365 Advent Calendar 2024」に参加しています。
15日目の記事です。

adventar.org

 

Microsoft365 管理者の皆様1年間お疲れ様です。

年末ということでMicrosoft 365でもお掃除してみませんか的なネタです。

 

Exchange Online でスケジュール管理している多くの企業ではリソース(会議室・備品等)も使われているかと思います。

さて、そんなリソースですが、ユーザーに依頼されて作ったもののそれが実際に使われているか?を把握する術が標準では用意されていないようです。

使われていないリソースを調べるため、Powershellスクリプトを作ってみました。

 

スクリプト全体

#---------------------------------------------------------------
# Exchange Online テナント内全リソースの過去6か月間の予約数を取得する
# ※上限1000まで
#---------------------------------------------------------------
#[準備] Exchange Online PowerShell モジュールのインストールしておく #Install-Module -Name ExchangeOnlineManagement  

# Exchange Online に接続 Connect-ExchangeOnline -UserPrincipalName {適切な権限を持ったアカウント} -ShowProgress $true # リソースメールボックスの取得 $resourceMailboxes = Get-Mailbox -RecipientTypeDetails RoomMailbox, EquipmentMailbox # 各リソースメールボックスの予定数を取得 $results = @() # 検索期間の設定 $startDate = (Get-Date).AddMonths(-6) $endDate = Get-Date foreach ($mailbox in $resourceMailboxes) { try { Write-Output "Processing mailbox: $($mailbox.DisplayName)" $calendarItems = Get-CalendarDiagnosticObjects -Identity $mailbox.Alias -StartDate $startDate -EndDate $endDate -ShouldBindToItem $true $count = $calendarItems.Count $results += [PSCustomObject]@{ DisplayName = $mailbox.DisplayName AppointmentCount = $count ErrorDescription = $null } } catch { $results += [PSCustomObject]@{ DisplayName = $mailbox.DisplayName AppointmentCount = -1 ErrorDescription = $_.Exception.Message } } } # 実行日の日付を取得 $date = Get-Date -Format "yyyy-MM-dd" # CSVファイルに出力 $results | Export-Csv -Path "C:\{ファイルの保存パス}\exo_resouce_reserves_$date.csv" -NoTypeInformation

 

スクリプト解説

(準備)Exchange Online PowerShell モジュールのインストール

Exchange Online Powershell モジュールを利用しますのであらかじめインストールしておきます。このモジュールを使用してExchange Onlineへの接続しています。
 

1.Exchange Online への接続

Exchange Online に接続します。

{適切な権限を持ったアカウント}は、UserPrincipalNameに置き換えてください。

# Exchange Online に接続
Connect-ExchangeOnline -UserPrincipalName {適切な権限を持ったアカウント} -ShowProgress $true
 

2.リソースメールボックスの取得

Get-Mailbox コマンドを使って、リソースメールボックス(会議室メールボックス、設備メールボックス)を取得します。これにより、予約数を確認したいリソースの一覧が $resourceMailboxes 変数に格納されます。
# リソースメールボックスの取得
$resourceMailboxes = Get-Mailbox -RecipientTypeDetails RoomMailbox, EquipmentMailbox
 

3.予約情報を格納するための配列変数の初期化

予約数などの情報を格納するための空の配列 $results を作成します。
# 各リソースメールボックスの予定数を取得
$results = @()
 

4.検索期間の設定

検索期間を過去6か月間に設定しています。$startDate は現在の日付から6か月前、$endDate は現在の日付となります。
# 検索期間の設定
$startDate = (Get-Date).AddMonths(-6)
$endDate = Get-Date
 

5.各リソースメールボックスからイベント数を取得

この部分では、各リソースメールボックスについてループを回し、Get-CalendarDiagnosticObjects コマンドを使ってそのリソースに関連する予定(予約)を取得します。取得した予定の数を $count として保存し、それを $results 配列に追加します。

  • try ブロック内で正常に予約数を取得できた場合は、リソース名と予約数を PSCustomObject として $results に追加します。
  • もし何らかのエラーが発生した場合は、catch ブロックが実行され、エラーメッセージとともに予約数を -1 として追加します。
foreach ($mailbox in $resourceMailboxes) {
    try {
        Write-Output "Processing mailbox: $($mailbox.DisplayName)"
        $calendarItems = Get-CalendarDiagnosticObjects -Identity $mailbox.Alias -StartDate $startDate -EndDate $endDate -ShouldBindToItem $true
        $count = $calendarItems.Count
        $results += [PSCustomObject]@{
            DisplayName = $mailbox.DisplayName
            AppointmentCount = $count
            ErrorDescription = $null
        }
    } catch {
        $results += [PSCustomObject]@{
            DisplayName = $mailbox.DisplayName
            AppointmentCount = -1
            ErrorDescription = $_.Exception.Message
        }
    }
}
 

6.CSVファイルに出力

収集した結果(リソース名と予約数)をCSV形式で指定したパスに保存します。ファイル名は実行日が追加される形になります。
{ファイルの保存パス}は適切なパスに書き換えてください。
# 実行日の日付を取得
$date = Get-Date -Format "yyyy-MM-dd"

# CSVファイルに出力
$results | Export-Csv -Path "C:\{ファイルの保存パス}\exo_resouce_reserves_$date.csv" -NoTypeInformation
 
このようなイメージでファイルに出力されます。最小限の情報のみですので、用途に応じて場所(office)等も出力した方が使いやすいかもしれません。

制限事項

1000件を以上のイベント数はカウントしていない

Get-CalendarDiagnosticObjects コマンドでイベント数を取得していますが、このコマンドは既定では1000件までしか取得できません。この為、1000件を超えるイベントがあるリソースでは実行時に警告メッセージが表示されます。メッセージに従いパラメータを追加することで対処できますが、今回のスクリプトの当初の目的は使われていないリソースを特定する事にあったのでので特に対処していません。
 

ワークスペースも対象となる

会議室・備品リソースを対象としていますが、今回のスクリプトではワークスペースも出力されます。これはワークスペースもRecipientTypeDetails が RoomMailbox のためです。使っていないので対処していません。
 
 

さいごに

このようにして取得したリソースの利用状況を不定期に公開してみたところ、当初の目的の使われていないリソースの可視化だけでなく、新規リソースの追加依頼が大幅に増えるという効果がありました。
使われていないリソースを何とかするという消極的な活動でしたが、当社の場合Outlook 予定表の活用推進にもプラスの効果が見られました。