Exchange 2010 has cmdlets (Add-MailboxFolderPermission, Set-MailboxFolderPermission) that allow an administrator to update folder permissions on a user's calendar. Unfortunately, Exchange 2007 does not have these cmdlets. We recently had a case that required updating many mailboxes (in this case resource mailboxes) to allow all users to be able to see the calendar (and details of bookings) in those mailboxes. Attached is a PowerShell script that uses EWS to update calendar permissions accordingly (including Default and Anonymous permissions). The script works in later versions of Exchange, though built in cmdlets from Exchange 2010 and above can do the same task. The mailbox parameter of the script can specify a CSV file instead of a mailbox, in which case all mailboxes contained in the CSV file will be processed.
Set-CalendarFolderPermission -Mailbox <string> -Delegate <string> -Permission <string> [-AuthUsername <string> -AuthPassword <string> [-AuthDomain <string>]] [-Impersonate <bool>] [-EwsUrl <string>] [-EWSManagedApiPath <string>] [-IgnoreSSLCertificate <bool>] [-WhatIf <bool>]
Required: -Mailbox : Mailbox SMTP email address, OR CSV file containing list of mailboxes to process -Delegate : Email address of the user who is being given the permissions (or can use Default or Anonymous) -Permission : None, Owner, PublishingEditor, Editor, PublishingEditor, Author, NoneditingAuthor, Reviewer, Contributor, FreeBusyTimeOnly, FreeBusyTimeAndSubjectAndLocation
Optional: -AuthUsername : Username for the account being used to connect to EWS (if not specified, current user is assumed) -AuthPassword : Password for the specified user (required if username specified) -AuthDomain : If specified, used for authentication (not required even if username specified) -Impersonate : Set to $true to use impersonation. -EwsUrl : Forces a particular EWS URl (otherwise autodiscover is used, which is recommended) -EWSManagedApiDLLFilePath : Full and path to the DLL for EWS Managed API (if not specified, default path for v1.2 is used) -IgnoreSSLCertificate : If $true, then any SSL errors will be ignored -WhatIf : If $true, then no changes are saved