どうもミツシマです。

今回はExchange Onlineにて会議室や備品用のリソースメールボックスを一括で作成するPowershellコマンドを検証してみた結果を記載します。

(注)2021/1/22内容編集してます
   変更理由は最後に記載しています

検証環境は以下の通り
PC:Windows10


〜検証〜

まずは作成コマンドと設定コマンドの確認。
コマンド設定内容
New-Mailbox -Room会議室メールボックスの作成
New-Mailbox -Equipment備品用メールボックスの作成
Set-MailboxRegionalConfigurationメールボックスのタイムゾーン設定
Set-MailboxFolderPermissionメールボックスの「予定表」のアクセス権設定
Set-CalendarProcessingリソースメールボックスの詳細設定
(例:予約最大期間等)

コマンドの確認は以上!!
完成したスクリプトがこちら↓↓↓


〜01-Add-ResourceMailBox.ps1〜

#環境変数の設定
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$CSVFilePath = $CurrentFolder + "\Add-ResourceMailBox.csv"
$OutputLogFilePath = $CurrentFolder + "\Add-ResourceMailBox.log"

$CSVファイルの読み込み
$AllResourceMailBox = Import-Csv -Path $CSVFilePath -Encoding Default

###事前接続準備
#認証情報取得
$UserCredential = Get-Credential

#接続(リモートセッションの作成)
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

#接続(リモートセッションの作成) プロキシ環境の場合
#$proxyOptions = New-PSSessionOption -ProxyAccessType IEConfig -ProxyAuthentication Negotiate
#$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection -SessionOption $proxyOptions

#Exchange Onlineコマンドレットのインポート
Import-PSSession $Session | Out-Null

foreach($ResourceMailBox in $AllResourceMailBox){
    
    #各パラメータを変数に代入
    $ResourceMailBoxName = $ResourceMailBox.DisplayName
    $MailBoxResourceCapacity = $ResourceMailBox.ResourceCapacity
    $MailBoxOffice = $ResourceMailBox.Office
    $MailBoxPhone = $ResourceMailBox.Phone

    $strCMDopt = @{}
    #「会議室」か「備品用」かを確認
    switch -exact($ResourceMailBox.ResourceType){

        "Room"{            
            $strCMDopt['Room'] = $true
        }

        "Equipment"{
            $strCMDopt['Equipment'] = $true
        }
    }

    #空文字 or Nullかをチェックして、値があればコマンドパラメータに代入
    if(-Not([string]::IsNullOrEmpty($MailBoxResourceCapacity))){
        $strCMDopt['ResourceCapacity'] = ${MailBoxResourceCapacity}
    }

    #空文字 or Nullかをチェックして、値があればコマンドパラメータに代入
    if(-Not([string]::IsNullOrEmpty($MailBoxOffice))){
        $strCMDopt['Office'] = ${MailBoxOffice}
    }

    #空文字 or Nullかをチェックして、値があればコマンドパラメータに代入
    if(-Not([string]::IsNullOrEmpty($MailBoxPhone))){
        $strCMDopt['Phone'] = ${MailBoxPhone}
    }
    
    
    $strMessage = "リソースメールボックス「" + $ResourceMailBoxName + "」を作成."
    Write-Output $strMessage >> $OutputLogFilePath    

    Write-Output "「${ResourceMailBoxName}」作成時のコマンドオプションを確認" >> $OutputLogFilePath
    $strCMDopt >> $OutputLogFilePath
    Write-Output `r`n >> $OutputLogFilePath

    #リソースメールボックスの作成
    New-Mailbox -Name $ResourceMailBoxName -DisplayName $ResourceMailBoxName -Alias $ResourceMailBox.Alias -PrimarySmtpAddress $ResourceMailBox.PrimarySmtpAddress @strCMDopt

}

#設定情報が反映されるまでの時間を稼ぐ(10秒)
Start-Sleep -s 10

#確認コマンド
Write-Output `r`n >> $OutputLogFilePath
Write-Output "===リソースメールボックスの一覧出力結果===" >> $OutputLogFilePath

$AllResourceMailBoxInfo = Get-Mailbox | Where-Object {($_.RecipientTypeDetails -eq "RoomMailbox") -or ($_.RecipientTypeDetails -eq "EquipmentMailbox")}
$AllResourceMailBoxInfo | Select-Object Name,Alias,PrimarySmtpAddress,Office,UMDtmfMap | Sort-Object Name | Format-List >> $OutputLogFilePath

Write-Output "===リソースメールボックスの一覧出力結果===" >> $OutputLogFilePath

#セッション切断
Remove-PSSession $Session

Write-Host "処理が完了しました."

pause



〜02-Set-ResourceMailBox.ps1〜

#環境変数の設定
$CurrentFolder = Split-Path $MyInvocation.MyCommand.Path -Parent
$CSVFilePath = $CurrentFolder + "\Add-ResourceMailBox.csv"
$OutputLogFilePath = $CurrentFolder + "\Set-ResourceMailBox.log"

$CSVファイルの読み込み
$AllResourceMailBox = Import-Csv -Path $CSVFilePath -Encoding Default

###事前接続準備
#認証情報取得
$UserCredential = Get-Credential

#接続(リモートセッションの作成)
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection

#接続(リモートセッションの作成) プロキシ環境の場合
#$proxyOptions = New-PSSessionOption -ProxyAccessType IEConfig -ProxyAuthentication Negotiate
#$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection -SessionOption $proxyOptions

#Exchange Onlineコマンドレットのインポート
Import-PSSession $Session | Out-Null

foreach($ResourceMailBox in $AllResourceMailBox){
    
    #各パラメータを変数に代入
    $ResourceMailBoxName = $ResourceMailBox.DisplayName
    $MailBoxAddress = $ResourceMailBox.PrimarySmtpAddress
    
    $strMessage = "リソースメールボックス「" + $ResourceMailBoxName + "」の設定を変更."
    Write-Output $strMessage >> $OutputLogFilePath    
    #作成したリソースメールボックスのタイムゾーンを日本語に設定
    Set-MailboxRegionalConfiguration -Identity $MailBoxAddress -DateFormat "yyyy/MM/dd" -Language "ja-JP" -TimeFormat "H:mm" -TimeZone "Tokyo Standard Time" -LocalizeDefaultFolderName

    #作成したリソースメールボックス(予定表)の「既定」アクセス権を「参照」に変更
    Set-MailboxFolderPermission  -Identity "${MailBoxAddress}:\予定表" -User "既定" -AccessRights Reviewer

    #作成したリソースメールボックスの予定表の詳細を表示させる(「件名」と「本文」)
    Set-CalendarProcessing -Identity $MailBoxAddress -DeleteSubject $False -DeleteComments $False -AddOrganizerToSubject $False

    #作成したリソースメールボックスの予約オプションを変更(「予約の依頼を自動的に承諾or辞退する(=AutoAccept)」と「最長予約リード時間」と「最大期間」)
    Set-CalendarProcessing -Identity $MailBoxAddress -AutomateProcessing AutoAccept -BookingWindowInDays $ResourceMailBox.BookingWindowInDays -MaximumDurationInMinutes $ResourceMailBox.MaximumDurationInMinutes

    #確認コマンド
    Write-Output "===${MailBoxAddress}の設定確認===" >> $OutputLogFilePath
    Get-MailboxRegionalConfiguration -Identity $MailBoxAddress >> $OutputLogFilePath
    Get-MailboxFolderPermission  -Identity "${MailBoxAddress}:\予定表" >> $OutputLogFilePath
    Get-CalendarProcessing -Identity $MailBoxAddress | Select-Object Identity,AutomateProcessing,DeleteSubject,DeleteComments,DeleteAttachments,AddOrganizerToSubject,BookingWindowInDays,MaximumDurationInMinutes | Format-List >> $OutputLogFilePath
    Write-Output `r`n >> $OutputLogFilePath
}

#セッション切断
Remove-PSSession $Session

Write-Host "処理が完了しました."

pause



〜Add-ResourceMailBox.csv〜

ResourceType,DisplayName,Alias,PrimarySmtpAddress,ResourceCapacity,Office,Phone,BookingWindowInDays,MaximumDurationInMinutes
Room,会議室 01(6名),test-mtg-room01,test-mtg-room01@〜.onmicrosoft.com,6,2F,03-9876-5432,60,120
Room,会議室 02(8名),test-mtg-room02,test-mtg-room02@〜.onmicrosoft.com,8,,03-9876-2345,60,120
Room,会議室 03(12名),test-mtg-room03,test-mtg-room03@〜.onmicrosoft.com,12,4F,,60,120
Room,ミーティングルーム(6名),test-share-mtg-room01,test-share-mtg-room01@〜.onmicrosoft.com,6,,,60,60
Equipment,社用車 01,test-share-car01,test-share-car01@〜.onmicrosoft.com,,,,60,480
Equipment,社用車 02,test-share-car02,test-share-car02@〜.onmicrosoft.com,,,,60,480
Equipment,プロジェクタ 01,test-share-projector01,test-share-projector01@〜.onmicrosoft.com,,,,60,120
Equipment,プロジェクタ 02,test-share-projector02,test-share-projector02@〜.onmicrosoft.com,,,,60,120


〜解説〜

準備するものは「01-Add-ResourceMailBox.ps1」・「02-Set-ResourceMailBox.ps1」・「Add-ResourceMailBox.csv」の3つ。
これを同じフォルダ階層に配置します。

CSVの記載内容について。
設定内容備考
ResourceType「Room」:会議室
「Equipment」:備品用
必須項目
DisplayName表示名(日本語可)必須項目
Aliasエイリアス(日本語不可)
※通常はメールアドレスの「@」より前
必須項目
PrimarySmtpAddressメールアドレス必須項目
ResourceCapacity定員「会議室」のみ使用可能オプション
(注)「備品用」では使用してはいけない
Office場所「会議室」のみ使用可能オプション
(注)「備品用」では使用してはいけない
Phone電話番号「会議室」のみ使用可能オプション
(注)「備品用」では使用してはいけない
BookingWindowInDays「予約」の最長予約リード時間何日前から予約出来るか
初期値:180日
MaximumDurationInMinutes「予約」の最大期間何時間連続で予約できるか
初期値:24時間

必須項目の4つは必ず入れるようにします。
また、「02-Set-ResourceMailBox.ps1」で予約の「最長予約リード時間(BookingWindowInDays)」と「最大時間(MaximumDurationInMinutes)」を設定する場合にはすべてに記載して下さい。
※逆に上記を初期値のままにするなら、スクリプトの設定行をコメントアウトして下さい。


次にスクリプト「01-Add-ResourceMailBox.ps1」の流れについて。
  1. CSVファイルをインポート(読み込む)
  2. それぞれの項目を読み込み必要なコマンドオプションを環境変数(ハッシュテーブル)に設定
  3. リソースメールボックスを順次作成
  4. リソースメールボックスの一覧をログ出力


スクリプト「02-Set-ResourceMailBox.ps1」の流れについて。
  1. CSVのファイルをインポート(読み込む)
  2. 作成したリソースメールボックスのタイムゾーンを「日本」に設定
  3. 作成したリソースメールボックスに「予定表」の「既定」アクセス権を「参照」に設定
  4. 作成したリソースメールボックスの予定表の詳細を表示させる(「予約の依頼を自動的に承諾or辞退する(=AutoAccept)」と「件名」と「本文」) ※2021/1/22赤字変更点
  5. 作成したリソースメールボックスの予約オプションを設定(最長予約リード時間」と「最大期間」)
  6. 設定した内容を確認するためのログ出力

以上です。
設定に関してはもっと変更出来る箇所がありますが、今回は自分が必要だと考えたものと頻繁に変更する必要がありそうなものをチョイスしました!!


今回苦労した部分が、「会議室」と「備品用」で使用出来るパラメータが違ったこと。
特に「定員」・「場所」・「電話番号」等のパラメータは「備品用」メールボックスを作成する時に使用するとエラーで作成出来なかった。
ちなみに作成後はGUI等で設定が可能だったので、作成後の設定は可能だと思われます。。。。
というより、備品用に上記パラメータがいるのかどうかも疑問ではあるが。。。^^;

そこで、作成時のコマンドパラメータを操作する為にこれらを変数に入れることを考えたのですが、通常のString型でやろうとするとコマンドパラメータとして認識出来ないのです!!!
色々調べたところ、ハッシュテーブル(連想配列)に代入することで使用が可能とのこと。
ここに行き着き、設定出来るまで時間かかったなぁ〜〜(^_^;)


後は大体コメントの通りです。

出力されるログについては結構長いので今回は割愛させてもらいます^^;
気になる人はとりあえずテスト的に実行してみて下さい。


何とかリソースメールボックスの作成・設定も検証出来たので今回はこれで終わりです^_^


(2021/1/22追記)
コマンドを一部変更しています。
その理由としては、変更前のコマンドでリソースメールボックスを作成するとスケジュールの自動応答が行われない為です。
※仕様が変わった???

以前はリソースメールボックスを作成すると
01

02

上記のような感じで「予約の依頼を自動的に承諾または拒否する」というのが初期値でした。記憶では。。。。(^_^;)


それが最近確認すると初期値が
03

04

なんか増えとる。。。
この「カスタマイズした設定で予約要求を承諾または拒否します」になっていると会議室などを予約した際に自動応答がされないです。

そのため、コマンドの中で
「Set-CalendarProcessing -Identity $MailBoxAddress -AutomateProcessing AutoAccept
を追加しています。
※「カスタマイズ〜」の場合「AutoUpdate」になっているようです。

う〜〜ん少し確認しない間に仕様が変わっていたりするので、日々情報のアップデートが必要ですね!!!
スポンサードリンク