无法删除与Exchange Web服务的会议

时间:2011-08-26 11:40:57

标签: c# .net sharepoint exchange-server exchangewebservices

我们在使用EWS从Exchange删除约会时遇到问题。

我们尝试从此处删除约会中的约会

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);

我们收到一条消息“无法删除对象”的异常。

  

Microsoft.Exchange.WebServices.Data.ServiceResponseException是   捕获的消息=对象无法删除   Source = Microsoft.Exchange.WebServices StackTrace:          在   Microsoft.Exchange.WebServices.Data.ServiceResponse.InternalThrowIfNecessary()          在   Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest 1.Execute() at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalDeleteItems(IEnumerable 1   itemIds,DeleteMode deleteMode,Nullable 1 sendCancellationsMode, Nullable 1 affectedTaskOccurrences,ServiceErrorHandling   ErrorHandling中)          在   Microsoft.Exchange.WebServices.Data.ExchangeService.DeleteItem(项目Id   itemId,DeleteMode deleteMode,Nullable 1 sendCancellationsMode, Nullable 1 affectedTaskOccurrences)          在   Microsoft.Exchange.WebServices.Data.Item.InternalDelete(DeleteMode   deleteMode,Nullable 1 sendCancellationsMode, Nullable 1   affectedTaskOccurrences)          在   Microsoft.Exchange.WebServices.Data.Appointment.Delete(DeleteMode   deleteMode,SendCancellationsMode sendCancellationsMode)          在   OurNameSpace.ExchangeCalendar.ViewCalendars.ExchangeMethods.DeleteMeeting(项目Id   id)InnerException:

如果我们改为尝试使用取消会议

deletedAppointment.CancelMeeting();

我们收到一条消息“用户必须是CancelCalendarItem操作的组织者”的异常。这让我很困惑,因为当我检查deletedAppointment对象时,我的电子邮件地址被设置为组织者。

我们像这样创建会议

Appointment appointment = new Appointment(service);
appointment.Subject = 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包含会议室邮箱的名称 如果我们暂停一段时间(直到约会出现在Outlook中)并在我们创建会议时使用的同一约会实例上调用删除,则约会将被成功删除。

代码在自定义SharePoint 2010 WebPart中运行。并不是说我认为它会有所作为,但是谁知道呢?

为什么我不能删除约会?
我该如何进一步调查?
据我所知,代码主要是MSDN示例的copy'n粘贴。

修改
当我将代码的最小示例复制到Winform应用程序时,会议被正确删除。在Sharepoint上下文中运行时会有任何重大差异吗?

编辑2
CurrentUser是用户提供的用户名和密码。 Exchange服务器与SharePoint服务器不在同一个域中。

编辑3
如果我在outlook中打开约会(使用与CurrentUser变量中相同的登录名称),我可以取消约会。

2 个答案:

答案 0 :(得分:6)

最后我们发现问题不在上面的简化例子中 问题是我们使用“仅查看”帐户来获取日历中的所有约会。然后,当我们尝试使用CurrentUser凭据删除约会时,我们尝试使用该约会ID,但该ID在新用户的上下文中无效。
当我们更改为使用CurrentUser检索日历项而不是仅查看帐户时,一切都开始起作用。

无论如何,谢谢你试图提供帮助。

答案 1 :(得分:1)

执行删除操作的用户必须具有足够的权限才能从特定资源/用户的日历中删除会议。

对于SharePoint,Web部件代码将在当前登录的用户下运行(从代码中可见)但是,当前登录的用户可能没有足够的权限在每个Exchange对象的日历上执行操作。我建议设置一个专用的Active Directory用户,该用户将从代码执行调用,同时具有操作每个Exchange Server对象(用户或资源)的日历项的完全访问权限。

以下是一些有用的PowerShell scriptlet,用于设置用户的权限并再次执行删除操作。

Set-MailboxFolderPermission -Identity MeetingRoom1@test.com:\Calendar -User Default -AccessRights Reviewer

Set-MailboxFolderPermission -Identity MeetingRoom2@test.com:\Calendar -User administrator@test.com  -AccessRights Owner
祝你好运