Exchange Calendar Permissions & Delegate Access
Permission Levels
Exchange calendar permissions use a role-based model. Each role is a named set of capabilities:
| Role | Create | Read | Edit Own | Edit All | Delete Own | Delete All | Create Subfolders | Manage Perms |
|---|---|---|---|---|---|---|---|---|
| Owner | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| PublishingEditor | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No |
| Editor | Yes | Yes | Yes | Yes | Yes | Yes | No | No |
| PublishingAuthor | Yes | Yes | Yes | No | Yes | No | Yes | No |
| Author | Yes | Yes | Yes | No | Yes | No | No | No |
| NonEditingAuthor | Yes | Yes | No | No | Yes | No | No | No |
| Reviewer | No | Yes | No | No | No | No | No | No |
| Contributor | Yes | No | No | No | No | No | No | No |
| AvailabilityOnly | No | Free/Busy only | No | No | No | No | No | No |
| LimitedDetails | No | Subject + Location | No | No | No | No | No | No |
| None | No | No | No | No | No | No | No | No |
Most common in practice: Editor (full access, typical for EA/delegate), Reviewer (read-only), LimitedDetails (org-wide free/busy default), AvailabilityOnly (minimal visibility).
Delegate Access vs. Direct Permissions
These are two distinct mechanisms that are often confused:
Delegate Access (via Outlook):
- Configured through: File > Account Settings > Delegate Access
- Delegates receive a copy of meeting requests, responses, and cancellations sent to the mailbox owner
- Delegates can act on behalf of the user (visible in From field: "Jane Smith on behalf of John Brown")
- Can be scoped to Calendar, Tasks, Inbox, Contacts, Notes individually
- Delegates can be granted "Send on Behalf" permission for email as well
- Best for: Executive Assistant managing a manager's full schedule
Direct Calendar Permissions (folder-level):
- Configured via PowerShell
Add-MailboxFolderPermissionor right-click > Share in Outlook - No meeting request forwarding — user just has access to view/edit the calendar folder
- Acts as themselves, not on behalf of
- Best for: giving a team member read access to a colleague's calendar without full delegation
Both can coexist. A user can be both a delegate AND have direct folder permissions set.
PowerShell Cmdlets
Connect to Exchange (On-Premises)
$Session = New-PSSession -ConfigurationName Microsoft.Exchange `
-ConnectionUri http://exchange.corp.local/PowerShell/ `
-Authentication Kerberos
Import-PSSession $Session -DisableNameChecking
Connect to Exchange Online
Install-Module ExchangeOnlineManagement -Scope CurrentUser
Connect-ExchangeOnline -UserPrincipalName [email protected]
View Permissions
# View all permissions on a user's calendar
Get-MailboxFolderPermission -Identity [email protected]:\Calendar
# Export to CSV for auditing
Get-MailboxFolderPermission -Identity [email protected]:\Calendar | Export-CSV C:\calendar-perms.csv -NoTypeInformation
# Check a specific user's access
Get-MailboxFolderPermission -Identity [email protected]:\Calendar | Where-Object { $_.User -like "*delegate*" }
Add Permissions (use when user has NO existing permissions)
Add-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User [email protected] -AccessRights Editor
# Read-only access
Add-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User [email protected] -AccessRights Reviewer
# Free/busy with subject and location
Add-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User [email protected] -AccessRights LimitedDetails
Modify Permissions (use when user ALREADY HAS permissions — Add will fail)
Set-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User [email protected] -AccessRights Editor
# Downgrade existing access
Set-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User [email protected] -AccessRights Reviewer
Remove Permissions
Remove-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User [email protected] -Confirm:$false
Default and Anonymous Permissions
Every calendar has two special permission entries that control org-wide visibility:
- Default — Applies to all authenticated users in the organization who are not explicitly listed.
- Anonymous — Applies to unauthenticated users (external sharing, if enabled).
# Show free/busy time with subject and location to all org users (recommended baseline)
Set-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User Default -AccessRights LimitedDetails
# Show only free/busy time (more restrictive)
Set-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User Default -AccessRights AvailabilityOnly
# Block all visibility (privacy mode)
Set-MailboxFolderPermission -Identity [email protected]:\Calendar `
-User Default -AccessRights None
Bulk Set Calendar Permissions
Apply a standard Default permission to all user calendars in the org:
# Set LimitedDetails for all user mailboxes (excludes resource/room mailboxes)
Get-Mailbox -RecipientTypeDetails UserMailbox -ResultSize Unlimited | ForEach-Object {
$calendar = "$($_.SamAccountName):\Calendar"
try {
Set-MailboxFolderPermission -Identity $calendar -User Default -AccessRights LimitedDetails -ErrorAction Stop
Write-Host "Set: $($_.SamAccountName)" -ForegroundColor Green
} catch {
# May need Add instead of Set if Default doesn't exist yet
Add-MailboxFolderPermission -Identity $calendar -User Default -AccessRights LimitedDetails -ErrorAction SilentlyContinue
Write-Host "Added: $($_.SamAccountName)" -ForegroundColor Yellow
}
}
Free/Busy Sharing
Within the same organization: Automatic via the Exchange Availability Service. No configuration needed — free/busy is available based on the Default calendar permission level set.
Cross-organization (federation): Requires configuring an organization relationship:
# View existing federation trust
Get-FederationTrust
# View organization relationships
Get-OrganizationRelationship
# Create new org relationship for cross-org free/busy
New-OrganizationRelationship -Name "Contoso" -DomainNames contoso.com `
-FreeBusyAccessEnabled $true -FreeBusyAccessLevel LimitedDetails
# Sharing policies for external users without federation
Get-SharingPolicy
New-SharingPolicy -Name "External Sharing" -Domains "contoso.com:CalendarSharingFreeBusyDetail" -Enabled $true
# Apply sharing policy to a mailbox
Set-Mailbox [email protected] -SharingPolicy "External Sharing"
# Test the org relationship
Test-OrganizationRelationship -Identity "Contoso" -UserIdentity [email protected]
Room and Resource Calendar Management
# View room mailboxes
Get-Mailbox -RecipientTypeDetails RoomMailbox | Select Name, PrimarySmtpAddress
# Auto-accept all meeting requests for a room
Set-CalendarProcessing -Identity "[email protected]" `
-AutomateProcessing AutoAccept `
-AllowConflicts $false `
-BookingWindowInDays 180 `
-MaximumDurationInMinutes 480
# Allow/deny specific users from booking
Set-CalendarProcessing -Identity "[email protected]" `
-BookInPolicy @("[email protected]") `
-AllBookInPolicy $false
# Add a delegate to manage room bookings
Set-CalendarProcessing -Identity "[email protected]" `
-ResourceDelegates "[email protected]" `
-AutomateProcessing AutoUpdate # Delegates manually approve/decline
# View current calendar processing settings
Get-CalendarProcessing -Identity "[email protected]" | Format-List
Troubleshooting
User can't see calendar details despite having Editor access:
- Verify with
Get-MailboxFolderPermission— confirm the entry exists and has the expected role. - Check the Default permission — if set to None and the user isn't explicitly listed, they get nothing.
- Confirm the user is looking at the correct calendar folder (not a sub-calendar).
"The specified object was not found in the store" error when adding permissions:
- The calendar folder path may differ for non-English mailboxes. Find it with:powershell
Get-MailboxFolderStatistics [email protected] | Where-Object { $_.FolderType -eq "Calendar" } | Select FolderPath - Use the exact localized folder name in the identity string.
Availability Service not returning free/busy for cross-org:
Test-OrganizationRelationship -Identity "PartnerOrg" -UserIdentity [email protected] -Verbose
Delegate not receiving meeting requests:
- Verify delegate configuration in Outlook: File > Account Settings > Delegate Access.
- The delegate setting in Outlook writes to the
publicDelegatesAD attribute — confirm it's populated.