Room Mailbox Booking Configuration - Final Solution
Date: January 2026
Author: Jeff Ricica
Organization: Rudolph Libbe Group
Issue: Users unable to book conference rooms, receiving "no permission" errors
Problem Summary
Conference room mailboxes were preventing users from booking rooms, including high-visibility issues with the CEO's admin being unable to book RL Conference Room 2. Users received error messages stating "You don't have permission to book this resource" even when rooms were available.
Root Cause
Room mailboxes had incorrect booking policy settings:
AllBookInPolicy: False- Required users to be on a permission listAddNewRequestsTentatively: True- Put requests in limbo awaiting approvalBookInPolicy: {}(empty) - No users were actually on the permission list
This combination meant no one had permission to book, and requests couldn't be processed automatically.
Solution
Apply Microsoft's documented standard configuration for "anyone can book" room resources.
Standard Conference Room Configuration
For regular conference rooms and Teams Rooms:
Set-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" `
-AutomateProcessing AutoAccept `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AllRequestInPolicy $false `
-AddNewRequestsTentatively $false `
-ConflictPercentageAllowed 0 `
-MaximumConflictInstances 0 `
-DeleteSubject $false `
-AddOrganizerToSubject $true `
-RemovePrivateProperty $true `
-DeleteComments $true `
-DeleteAttachments $true
What this achieves:
- ✅ Anyone can book the room
- ✅ Booking conflicts are automatically prevented
- ✅ Non-conflicting requests are auto-accepted immediately
- ✅ Conflicting requests are auto-declined immediately
- ✅ No delegate approval required
- ✅ Meeting details display on Teams Room devices
PTO Tracking Room Configuration
For rooms used to track time off (CLE PTO, SMO PTO, RL Site Safety Team):
Set-CalendarProcessing -Identity "PTORoomEmail@rlgbuilds.com" `
-AutomateProcessing AutoAccept `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AllRequestInPolicy $false `
-AddNewRequestsTentatively $false `
-ConflictPercentageAllowed 100 `
-MaximumConflictInstances 1000 `
-DeleteSubject $false `
-AddOrganizerToSubject $true
What this achieves:
- ✅ Multiple people can be off at the same time
- ✅ Allows up to 1000 overlapping bookings
- ✅ Still auto-accepts/processes immediately
Implementation Scripts
Apply to All Conference Rooms
# Get all room mailboxes
$AllRooms = Get-EXOMailbox -RecipientTypeDetails RoomMailbox -ResultSize Unlimited
# Exclude PTO tracking rooms
$PTORooms = @(
"RLSiteSafetyTeam@rlgbuilds.com",
"CLEPTO@RLGbuilds.com",
"smopto@rlgbuilds.com"
)
# Configure standard conference rooms
foreach ($Room in $AllRooms) {
# Skip PTO rooms
if ($PTORooms -contains $Room.PrimarySmtpAddress) {
Write-Host "Skipping PTO room: $($Room.DisplayName)" -ForegroundColor Yellow
continue
}
Write-Host "Configuring: $($Room.DisplayName)" -ForegroundColor Cyan
Set-CalendarProcessing -Identity $Room.PrimarySmtpAddress `
-AutomateProcessing AutoAccept `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AllRequestInPolicy $false `
-AddNewRequestsTentatively $false `
-ConflictPercentageAllowed 0 `
-MaximumConflictInstances 0 `
-DeleteSubject $false `
-AddOrganizerToSubject $true `
-RemovePrivateProperty $true `
-DeleteComments $true `
-DeleteAttachments $true `
-ErrorAction Continue
}
Write-Host "`nStandard conference rooms configured!" -ForegroundColor Green
Configure PTO Tracking Rooms
# Define PTO room email addresses
$PTORooms = @(
"RLSiteSafetyTeam@rlgbuilds.com",
"CLEPTO@RLGbuilds.com",
"smopto@rlgbuilds.com"
)
# Configure PTO rooms to allow conflicts
foreach ($Room in $PTORooms) {
Write-Host "Configuring PTO room: $Room" -ForegroundColor Cyan
Set-CalendarProcessing -Identity $Room `
-AutomateProcessing AutoAccept `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AllRequestInPolicy $false `
-AddNewRequestsTentatively $false `
-ConflictPercentageAllowed 100 `
-MaximumConflictInstances 1000 `
-DeleteSubject $false `
-AddOrganizerToSubject $true `
-ErrorAction Continue
}
Write-Host "`nPTO tracking rooms configured!" -ForegroundColor Green
Verification
Quick Check (Single Room)
Get-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" |
FL DisplayName,AllBookInPolicy,AllRequestOutOfPolicy,AddNewRequestsTentatively,ConflictPercentageAllowed
Expected output for standard conference room:
AllBookInPolicy : True
AllRequestOutOfPolicy : False
AddNewRequestsTentatively : False
ConflictPercentageAllowed : 0
Expected output for PTO tracking room:
AllBookInPolicy : True
AllRequestOutOfPolicy : False
AddNewRequestsTentatively : False
ConflictPercentageAllowed : 100
Comprehensive Verification (All Rooms)
# Get all room mailboxes
$AllRooms = Get-EXOMailbox -RecipientTypeDetails RoomMailbox -ResultSize Unlimited
# Define PTO rooms for different validation
$PTORooms = @(
"RLSiteSafetyTeam@rlgbuilds.com",
"CLEPTO@RLGbuilds.com",
"smopto@rlgbuilds.com"
)
$Results = @()
$CorrectCount = 0
$IncorrectCount = 0
foreach ($Room in $AllRooms) {
$CalSettings = Get-CalendarProcessing -Identity $Room.PrimarySmtpAddress
# Determine if this is a PTO room
$IsPTORoom = $PTORooms -contains $Room.PrimarySmtpAddress
# Check if correctly configured based on room type
if ($IsPTORoom) {
$IsCorrect = (
$CalSettings.AllBookInPolicy -eq $true -and
$CalSettings.AllRequestOutOfPolicy -eq $false -and
$CalSettings.AddNewRequestsTentatively -eq $false -and
$CalSettings.ConflictPercentageAllowed -eq 100 -and
$CalSettings.MaximumConflictInstances -eq 1000
)
$RoomType = "PTO Tracker"
} else {
$IsCorrect = (
$CalSettings.AllBookInPolicy -eq $true -and
$CalSettings.AllRequestOutOfPolicy -eq $false -and
$CalSettings.AddNewRequestsTentatively -eq $false -and
$CalSettings.ConflictPercentageAllowed -eq 0 -and
$CalSettings.MaximumConflictInstances -eq 0
)
$RoomType = "Conference Room"
}
if ($IsCorrect) {
$CorrectCount++
$Status = "CORRECT"
} else {
$IncorrectCount++
$Status = "NEEDS FIX"
}
$Results += [PSCustomObject]@{
DisplayName = $Room.DisplayName
PrimarySmtpAddress = $Room.PrimarySmtpAddress
RoomType = $RoomType
Status = $Status
AllBookInPolicy = $CalSettings.AllBookInPolicy
AllRequestOutOfPolicy = $CalSettings.AllRequestOutOfPolicy
AddNewRequestsTentatively = $CalSettings.AddNewRequestsTentatively
ConflictPercentageAllowed = $CalSettings.ConflictPercentageAllowed
MaximumConflictInstances = $CalSettings.MaximumConflictInstances
}
}
# Display summary
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "VERIFICATION SUMMARY" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Total Rooms: $($AllRooms.Count)" -ForegroundColor White
Write-Host "Correctly Configured: $CorrectCount" -ForegroundColor Green
Write-Host "Need Fixing: $IncorrectCount" -ForegroundColor $(if ($IncorrectCount -gt 0) { "Red" } else { "Green" })
# Export and display results
$ExportPath = ".\RoomVerification-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv"
$Results | Export-Csv -Path $ExportPath -NoTypeInformation
Write-Host "`nResults exported to: $ExportPath" -ForegroundColor Green
$Results | Out-GridView -Title "Room Configuration Verification"
# Show rooms that need fixing
if ($IncorrectCount -gt 0) {
Write-Host "`nROOMS THAT NEED FIXING:" -ForegroundColor Red
$Results | Where-Object { $_.Status -eq "NEEDS FIX" } |
Format-Table DisplayName, RoomType, AllBookInPolicy, ConflictPercentageAllowed -AutoSize
}
Key Settings Explained
Critical Settings for "Anyone Can Book"
| Setting | Value | Purpose |
|---|---|---|
AutomateProcessing |
AutoAccept | Automatically process booking requests |
AllBookInPolicy |
True | Allow anyone to book (bypass permission list) |
AllRequestOutOfPolicy |
False | Don't auto-decline anyone |
AllRequestInPolicy |
False | Don't require approval for anyone |
AddNewRequestsTentatively |
False | Process immediately, don't wait |
Conflict Prevention Settings
| Setting | Conference Rooms | PTO Trackers |
|---|---|---|
ConflictPercentageAllowed |
0 | 100 |
MaximumConflictInstances |
0 | 1000 |
Conference Rooms: No overlapping bookings allowed (0% conflict tolerance)
PTO Trackers: Unlimited overlapping bookings allowed (100% conflict tolerance)
Display Settings (Teams Rooms)
| Setting | Value | Purpose |
|---|---|---|
DeleteSubject |
False | Show meeting subject on device |
AddOrganizerToSubject |
True | Show who booked it |
RemovePrivateProperty |
True | Private meetings still show as busy |
DeleteComments |
True | Remove meeting body text |
DeleteAttachments |
True | Remove attachments |
Quick Reference Commands
Fix a Single Room Immediately
# Standard conference room
Set-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AddNewRequestsTentatively $false
# PTO tracking room
Set-CalendarProcessing -Identity "PTORoom@rlgbuilds.com" `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AddNewRequestsTentatively $false `
-ConflictPercentageAllowed 100 `
-MaximumConflictInstances 1000
Check Current Settings
Get-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" |
FL AllBookInPolicy,AllRequestOutOfPolicy,AddNewRequestsTentatively,ConflictPercentageAllowed,MaximumConflictInstances
List All Room Mailboxes
Get-EXOMailbox -RecipientTypeDetails RoomMailbox |
Select DisplayName,PrimarySmtpAddress |
Sort DisplayName
New Room Setup
When creating a new conference room or Teams Room, apply this configuration immediately:
# After creating the room mailbox, run:
Set-CalendarProcessing -Identity "NewRoom@rlgbuilds.com" `
-AutomateProcessing AutoAccept `
-AllBookInPolicy $true `
-AllRequestOutOfPolicy $false `
-AllRequestInPolicy $false `
-AddNewRequestsTentatively $false `
-ConflictPercentageAllowed 0 `
-MaximumConflictInstances 0 `
-DeleteSubject $false `
-AddOrganizerToSubject $true `
-RemovePrivateProperty $true `
-DeleteComments $true `
-DeleteAttachments $true
Troubleshooting
Users Getting "No Permission" Error
Cause: AllBookInPolicy: False or AddNewRequestsTentatively: True
Fix:
Set-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" `
-AllBookInPolicy $true `
-AddNewRequestsTentatively $false
Bookings Stuck in "Tentative" Status
Cause: AddNewRequestsTentatively: True with no delegates
Fix:
Set-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" `
-AddNewRequestsTentatively $false
Double Bookings Occurring
Cause: ConflictPercentageAllowed > 0 or MaximumConflictInstances > 0 on conference room
Fix:
Set-CalendarProcessing -Identity "RoomEmail@rlgbuilds.com" `
-ConflictPercentageAllowed 0 `
-MaximumConflictInstances 0
Important Notes
Teams Rooms vs Regular Conference Rooms
- Same booking configuration applies to both
- Teams Room devices just display what's on the calendar
- Display settings control what shows on the Teams Room screen
- Booking policy settings control who can book and conflict handling
PTO Tracking Rooms
Current PTO tracking rooms at RLG:
- RL Site Safety Team (
RLSiteSafetyTeam@rlgbuilds.com) - CLE PTO (
CLEPTO@RLGbuilds.com) - SMO PTO (
smopto@rlgbuilds.com)
These require special configuration to allow multiple overlapping bookings.
Configuration Changes Take Effect
- Changes are typically effective within 15-30 seconds
- No need to restart Teams Room devices
- Users can retry booking immediately after configuration change
Success Criteria
After applying this configuration:
- ✅ All users can book any conference room
- ✅ Booking conflicts are automatically prevented
- ✅ No "permission" errors occur
- ✅ Bookings are processed immediately (no waiting)
- ✅ Teams Room devices display meeting details correctly
- ✅ PTO trackers allow multiple simultaneous bookings
Document Version: 1.0
Last Updated: January 16, 2026
Status: Production - Verified Working