我们在使用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,Nullable1 sendCancellationsMode, Nullable
1 affectedTaskOccurrences,ServiceErrorHandling ErrorHandling中) 在 Microsoft.Exchange.WebServices.Data.ExchangeService.DeleteItem(项目Id itemId,DeleteMode deleteMode,Nullable1 sendCancellationsMode, Nullable
1 affectedTaskOccurrences) 在 Microsoft.Exchange.WebServices.Data.Item.InternalDelete(DeleteMode deleteMode,Nullable1 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
变量中相同的登录名称),我可以取消约会。
答案 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
祝你好运