Variables · fill in your values
Persisted to your browser. Used in all cmdlets below.1. Connection
Every cmdlet below assumes you have an authenticated session against your Exchange Online tenant. The ExchangeOnlineManagement v3 module is the supported path — the older Connect-MsolService / Remote PowerShell flows are deprecated.
Connect-ExchangeOnline uses interactive browser auth by default and works with conditional access / MFA out of the box. For unattended automation use -CertificateThumbprint with an app registration (Application.ReadWrite.All + Exchange.ManageAsApp).
2. Create the room mailbox
A room mailbox is a special RecipientTypeDetails = RoomMailbox object. It has no licence (in Exchange Online room mailboxes are free for up to 25 GB) and no password — sign-in is disabled. The basics are New-Mailbox -Room followed by Set-Mailbox for the resource capacity.
ResourceCapacity on Set-Mailbox is what Room Finder shows. Set-Place -Capacity also sets it and is the newer canonical surface — they're synced. Use Set-Place going forward.
3. Calendar booking policy
Set-CalendarProcessing controls every aspect of how the room responds to meeting requests — whether it auto-accepts, who can book outside hours, what gets stripped from subject lines, who approves out-of-policy requests, and so on. The default AutomateProcessing = AutoAccept is right for most rooms; locked-down spaces need AutoUpdate + delegates.
Inspect current policy
AutomateProcessing modes
Booking window & duration
Subject / body cleanup
Conflicts & recurring meetings
In-policy / out-of-policy gates
Set-CalendarProcessing -BookInPolicy "newuser@…" REPLACES the entire list and silently drops every existing member. For one-off adds, always read-modify-write: (Get-CalendarProcessing -Identity X).BookInPolicy += "newuser@…" appends; use -= "user@…" to remove. Same trick works for RequestInPolicy, RequestOutOfPolicy, and ResourceDelegates. The incremental cmdlets below show the full safe form.
External meeting requests
"Set the standard policy" — one-shot
A sensible default for most general-purpose rooms. Auto-accept, 6-month booking window, 4-hour max meeting, allow recurring, keep subject + organizer.
4. Delegates, calendar editors & permissions
There are two distinct concepts here that are routinely confused:
- Resource delegates (
Set-CalendarProcessing -ResourceDelegates) — whenAutomateProcessing = AutoUpdate, these are the people who get the approval email for tentative bookings. They aren't given any calendar permissions automatically. - Calendar folder permissions (
Add-MailboxFolderPermission) — these give users the ability to see / edit / manage entries on the room's calendar in Outlook. Reviewer = read-only, Editor = create + edit + delete, Owner = full control.
Owner = read, edit, delete, change permissions · PublishingEditor = read, edit, delete, create sub-folders · Editor = read, edit, delete · PublishingAuthor / Author = read, create + edit/delete own · NonEditingAuthor = read, create, delete own · Reviewer = read-only · Contributor = create only (no read) · AvailabilityOnly = free/busy only · LimitedDetails = free/busy + subject + location · None = no access.
Read current permissions
Calendar editors / delegates / reviewers
Change or remove a permission
Send-on-behalf & Send-as
Resource delegates (approval workflow)
5. Room Finder properties (Set-Place)
Set-Place is what powers the Room Finder pane in Outlook on the Web and the new Teams meeting scheduler. Without these properties set, the room appears in Get-Mailbox but is invisible to Room Finder filters (capacity, building, floor, AV equipment).
Set-Place (Building, Floor, Capacity, etc.), AND2. Membership in a Room List (distribution group with
-RoomList flag). A room with Set-Place applied but no RoomList membership is queryable via Get-Place but won't show in the Outlook Room Finder dropdown.
Read current properties
Building & floor
Capacity & accessibility
Address & geo
AV equipment metadata
Tags (custom search keywords)
Full Set-Place — every property at once
6. Room lists
A room list is just a regular distribution group with the -RoomList flag — but that flag is what makes Outlook show "Building" and "Capacity" filters in Room Finder. One room can belong to multiple lists (e.g. "Sydney HQ" and "Has video conferencing").
7. Workspace mailboxes
Workspace mailboxes are RecipientTypeDetails = WorkspaceMailbox — like rooms but designed for hot-desking. Critical difference: the default booking policy allows multiple concurrent bookings (per-seat capacity) — AllowConflicts = $true. Don't set them up like rooms or you'll lose the whole point.
Set-Place -Capacity is the number of bookable seats at the same time. Set AllowConflicts $true on Set-CalendarProcessing too, otherwise concurrent bookings get auto-declined.
8. Diagnostics & reports
Find all rooms, audit booking settings, dig into why a specific meeting got declined, export tenant-wide.
9. Bulk CSV patterns
For new building rollouts. CSV column names match cmdlet parameters so the loops stay short.
Import-Csv exposes columns as object properties — reference them as $_.ColumnName inside the ForEach-Object block.
Reference
- MS Learn — Set-CalendarProcessing — every parameter, with notes on which ones only apply when AutomateProcessing is AutoAccept vs AutoUpdate.
- MS Learn — Set-Place — Room Finder property reference.
- MS Learn — Add-MailboxFolderPermission — every AccessRights role with its capability list.
- MS Learn — Manage room mailboxes — admin centre flow that the cmdlets above map to.
- MS Learn — Room & equipment mailboxes — Microsoft 365 admin centre walkthrough.
- MS Learn — Get-CalendarDiagnosticAnalysis — when a booking goes wrong and you need the audit trail.