Can not delete meeting with exchange web services
We have a problem deleting Appointments from Exchange using EWS.
We try to delete Appointments from Exchange like this
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.Credentials = CurrentUser; // NetworkCredential
service.Url = new Uri(WebserviceAddress);
service.UseDefaultCredentials = false;
var appointment = Appointment.Bind(service, id);
deletedAppointment.Delete(DeleteMode.MoveToDeletedItems, SendCancellationsMode.SendToAllAndSaveCopy);
We get an exception with the message "Object cannot be deleted."
Microsoft.Exchange.WebServices.Data.ServiceResponseException was caught Message=Object cannot be deleted.
Source=Microsoft.Exchange.WebServices StackTrace: at Microsoft.Exchange.WebServices.Data.ServiceResponse.InternalThrowIfNecessary() at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest1.Execute() at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalDeleteItems(IEnumerable
1 itemIds, DeleteMode deleteMode, Nullable1 sendCancellationsMode, Nullable
1 affectedTaskOccurrences, ServiceErrorHandling errorHandling) at Microsoft.Exchange.WebServices.Data.ExchangeService.DeleteItem(ItemId itemId, DeleteMode deleteMode, Nullable1 sendCancellationsMode, Nullable
1 affectedTaskOccurrences) at Microsoft.Exchange.WebServices.Data.Item.InternalDelete(DeleteMode deleteMode, Nullable1 sendCancellationsMode, Nullable
1 affectedTaskOccurrences) at Microsoft.Exchange.WebServices.Data.Appointment.Delete(DeleteMode deleteMode, SendCancellationsMode sendCancellationsMode) at OurNameSpace.ExchangeCalendar.ViewCalendars.ExchangeMethods.DeleteMeeting(ItemId id) InnerException:
If we instead try to use cancel the meeting
deletedAppointment.CancelMeeting();
we get an exception with the message "User must be an organizer for CancelCalendarItem action." This makes me really confused, because when I inspect the deletedAppointment
object my email address is set as the organizer.
We create our meetings like this
Appointment appointment = new Appointment(service);
appointment.Subj开发者_如何学编程ect = subject;
appointment.Body = body;
appointment.Start = start;
appointment.End = end;
appointment.Location = location;
appointment.RequiredAttendees.Add(location);
appointment.RequiredAttendees.Add(requiredAttendees);
try
{
appointment.Save(SendInvitationsMode.SendOnlyToAll);
}
catch ...
location
contains the name of a conference room mailbox.
The code runs in a custom SharePoint 2010 WebPart. Not that I could think that it would make any difference, but who knows?
Why can't I delete the appointment?
How can I investigate further? As far as I can see the code is mostly copy'n paste of an MSDN example.Edit
When I copy a minimal example of the code to a Winform application the meeting is deleted correctly. Could there be any critical difference when running in the Sharepoint context?Edit 2
CurrentUser
is a user supplied username and password. The Exchange server is not on the same domain as SharePoint server.
Edit 3
If I open the appointment in outlook (with the same login as in theCurrentUser
variable) I can cancel the appointment.At last we found out that the issue was outside the simplified example above.
The issue was that we used a "view only" account to fetch all the appointments in the calendar. We then tried to use that appointment id when we tried to delete the appointment using the CurrentUser
credentials, but that ID was not valid in the context of the new user.
When we changed to retrieve the calendar items with CurrentUser
instead of our view only account everything started to work.
Thanks anyway for trying to help.
The user performing the delete operation must have enough permissions to delete the Meetings from a specific resource/user's calender.
In case of SharePoint, the web part code will be run under the current logged on user (as visible from your code) however, current logged on user may not have enough rights to perform the operation on every Exchange object's calender. I would recommend setting up a dedicated Active Directory user who will perform the calls from the code and at the same time have full access to manipulate the calendar items of every Exchange Server's object (user or resource).
Here are some useful PowerShell scriptlets to set the permissions for the user and perform the deletion operation again.
Set-MailboxFolderPermission -Identity MeetingRoom1@test.com:\Calendar -User Default -AccessRights Reviewer
Set-MailboxFolderPermission -Identity MeetingRoom2@test.com:\Calendar -User administrator@test.com -AccessRights Owner
Good luck
精彩评论