There is an amazing article (https://itpro.outsidesys.com/2017/11/06/exchange-configuring-the-resource-booking-attendant-with-powershell/) published by John Dougherty on how to adjust resource booking configuration having 4 different scenarios.
Those 4 scenarios are:
- Anyone can book the resource. No delegate approval required.
- Anyone can book the resource. Delegate approval required for all requests.
- Only a list of people can book the resource without delegate approval. All others require delegate approval.
- Only a list of people can book the resource. All others are denied. There are no delegates.
Not everything can be done through an Admin portal, that’s why having such a PowerShell script is crucial.
I decided to do several things to improve that process:
- Added code to check an existing configuration for every single Room and Resource. If the configuration is any different than these 4 above, then the script notifies you about it.
- Combined scripts into a single one.
- Added more user input to not adjust the code every time.
$scenario1 = "Anyone can book the resource. No delegate approval required." $scenario2 = "Anyone can book the resource. Delegate approval required for all requests." $scenario3 = "Only a list of people can book the resource without delegate approval. All others require delegate approval." $scenario4 = "Only a list of people can book the resource. All others are denied. There are no delegates." $resources = Get-Mailbox -ResultSize unlimited | Where-Object { ($_.RecipientTypeDetails -eq "EquipmentMailbox") -or ($_.RecipientTypeDetails -eq "RoomMailbox") } | Get-CalendarProcessing $collection = @() $i = 0 ForEach ($resource in $resources) { $outObject = "" | Select "Number","Identity","Scenario" $i = $i + 1 $outObject."Number" = $i $outObject."Identity" = $resource.Identity If ( $resource.AllBookInPolicy -eq $True -and $resource.AllRequestInPolicy -eq $False -and $resource.AllRequestOutOfPolicy -eq $False -and $resource.ResourceDelegates.count -eq 0 -and $resource.BookInPolicy.count -eq 0 -and $resource.RequestInPolicy.count -eq 0 -and $resource.RequestOutOfPolicy.count -eq 0 ) { $outObject."Scenario" = $scenario1 } ElseIf ( $resource.AllBookInPolicy -eq $False -and $resource.AllRequestInPolicy -eq $True -and $resource.AllRequestOutOfPolicy -eq $False -and $resource.ResourceDelegates.count -gt 0 -and $resource.BookInPolicy.count -eq 0 -and $resource.RequestInPolicy.count -eq 0 -and $resource.RequestOutOfPolicy.count -eq 0 ) { $outObject."Scenario" = $scenario2 } ElseIf ( $resource.AllBookInPolicy -eq $False -and $resource.AllRequestInPolicy -eq $True -and $resource.AllRequestOutOfPolicy -eq $False -and $resource.ResourceDelegates.count -gt 0 -and $resource.BookInPolicy.count -gt 0 -and $resource.RequestInPolicy.count -eq 0 -and $resource.RequestOutOfPolicy.count -eq 0 ) { $outObject."Scenario" = $scenario3 } ElseIf ( $resource.AllBookInPolicy -eq $False -and $resource.AllRequestInPolicy -eq $False -and $resource.AllRequestOutOfPolicy -eq $False -and $resource.ResourceDelegates.count -eq 0 -and $resource.BookInPolicy.count -gt 0 -and $resource.RequestInPolicy.count -eq 0 -and $resource.RequestOutOfPolicy.count -eq 0 ) { $outObject."Scenario" = $scenario4 } Else { $outObject."Scenario" = "!!! Possible misconfiguration !!!" } $collection += $outObject } $collection | Out-Host Do { Try { $num = $true [int]$selectedinput = Read-host "Select a Resource you would like to adjust by typing its number" } Catch {$num = $false} } Until (($selectedinput -gt 0 -and $selectedinput -le $collection.count) -and $num) $selectedresource = $collection[[int]$selectedinput - 1] Write-host `n Write-host "You selected" $selectedresource.Identity If ($selectedresource.Scenario -ne $scenario1) { Write-host `n"Because of the current scenario applied to this resource, here is some additional info:" Get-CalendarProcessing -Identity $selectedresource.Identity | Select @{ Label="Current delegates"; Expression={$_.ResourceDelegates} }, @{ Label="Current allowed users"; Expression={$_.BookInPolicy} } | fl } $scenariocollection = @() $scenariocollection += New-object PSObject -Property(@{Number = 1; Option = $scenario1}) $scenariocollection += New-object PSObject -Property(@{Number = 2; Option = $scenario2}) $scenariocollection += New-object PSObject -Property(@{Number = 3; Option = $scenario3}) $scenariocollection += New-object PSObject -Property(@{Number = 4; Option = $scenario4}) $scenariocollection | Out-Host Do { Try { $num = $true [int]$selectedoptioninput = Read-host "Select an option you would like to apply to" $selectedresource.Identity } Catch {$num = $false} } Until (($selectedoptioninput -gt 0 -and $selectedoptioninput -le $scenariocollection.count) -and $num) If ($selectedoptioninput -eq 1) { $Properties = @{ AutomateProcessing = 'AutoAccept' AllBookInPolicy = $true AllRequestInPolicy = $false AllRequestOutOfPolicy = $false ResourceDelegates = $null BookInPolicy = $null RequestInPolicy = $null RequestOutOfPolicy = $null AddAdditionalResponse = $false AdditionalResponse = $null } Set-CalendarProcessing -Identity $selectedresource.Identity @Properties Write-host `n"Done!" } ElseIf ($selectedoptioninput -eq 2) { $delegatesstring = Read-host "Create a comma separated list with each delegate's primary email address (using mail enabled distribution groups is allowed)" $delegates = $delegatesstring.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries).Trim() $Properties = @{ AutomateProcessing = 'AutoAccept' AllBookInPolicy = $false AllRequestInPolicy = $true AllRequestOutOfPolicy = $false ResourceDelegates = $delegates BookInPolicy = $null RequestInPolicy = $null RequestOutOfPolicy = $null AddAdditionalResponse = $false AdditionalResponse = $null } Set-CalendarProcessing -Identity $selectedresource.Identity @Properties Write-host `n"Done!" } ElseIf ($selectedoptioninput -eq 3) { $usersstring = Read-host "Create a comma separated list with each allowed user's primary email address (using mail enabled distribution groups is allowed)" $users = $usersstring.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries).Trim() $delegatesstring = Read-host "Create a comma separated list with each delegate's primary email address (using mail enabled distribution groups is allowed)" $delegates = $delegatesstring.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries).Trim() $Properties = @{ AutomateProcessing = 'AutoAccept' AllBookInPolicy = $false AllRequestInPolicy = $true AllRequestOutOfPolicy = $false ResourceDelegates = $delegates BookInPolicy = $users RequestInPolicy = $null RequestOutOfPolicy = $null AddAdditionalResponse = $false AdditionalResponse = $null } Set-CalendarProcessing -Identity $selectedresource.Identity @Properties Write-host `n"Done!" } ElseIf ($selectedoptioninput -eq 4) { $usersstring = Read-host "Create a comma separated list with each allowed user's primary email address (using mail enabled distribution groups is allowed)" $users = $usersstring.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries).Trim() $responsestring = Read-host "Message that other users will see when attempting to book a restricted resource" $Properties = @{ AutomateProcessing = 'AutoAccept' AllBookInPolicy = $false AllRequestInPolicy = $false AllRequestOutOfPolicy = $false ResourceDelegates = $null BookInPolicy = $users RequestInPolicy = $null RequestOutOfPolicy = $null AddAdditionalResponse = $true AdditionalResponse = $responsestring } Set-CalendarProcessing -Identity $selectedresource.Identity @Properties Write-host `n"Done!" } Remove-Variable * -ErrorAction SilentlyContinue