Невозможно удалить встречу с биржей веб-сервисов - PullRequest
2 голосов
/ 26 августа 2011

У нас проблема с удалением встреч из Exchange с помощью 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 is пойман Сообщение = Объект не может быть удален.
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 disabledTaskOccurferences, ServiceErrorHandling обработка ошибок) в Microsoft.Exchange.WebServices.Data.ExchangeService.DeleteItem (ItemId itemId, DeleteMode deleteMode, Nullable 1 sendCancellationsMode, Nullable 1 затрагиваемых заданий задачи) в 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 (ItemId 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. Не то чтобы я мог подумать, что это что-то изменит, но кто знает?

Почему я не могу удалить встречу?
Как я могу продолжить расследование?
Насколько я могу судить, код в основном копирует и вставляет пример MSDN.

Редактировать
Когда я копирую минимальный пример кода в приложение Winform, собрание удаляется правильно. Может ли быть какая-либо критическая разница при работе в контексте Sharepoint?

Редактировать 2
CurrentUser - это пользовательское имя пользователя и пароль. Сервер Exchange не находится в том же домене, что и сервер SharePoint.

Редактировать 3
Если я открываю встречу в Outlook (с тем же логином, что и в переменной CurrentUser), я могу отменить встречу.

Ответы [ 2 ]

6 голосов
/ 29 августа 2011

Наконец мы обнаружили, что проблема не в упрощенном примере, приведенном выше.
Проблема заключалась в том, что мы использовали учетную запись «только для просмотра», чтобы получать все встречи в календаре.Затем мы попытались использовать этот идентификатор встречи, когда пытались удалить встречу, используя учетные данные CurrentUser, но этот идентификатор был недопустим в контексте нового пользователя.
Когда мы изменили получение элементов календаря с CurrentUser вместо нашего просмотра только учетная запись все стало работать.

В любом случае спасибо за попытку помочь.

1 голос
/ 28 августа 2011

Пользователь, выполняющий операцию удаления, должен иметь достаточные разрешения для удаления собраний из определенного ресурса / календаря пользователя.

В случае SharePoint код веб-части будет выполняться под текущим вошедшим пользователем (как видно из вашего кода), однако, текущий вошедший в систему пользователь может не иметь достаточно прав для выполнения операции с каждым календарем объекта Exchange.Я бы порекомендовал настроить отдельного пользователя Active Directory, который будет выполнять вызовы из кода и в то же время иметь полный доступ для манипулирования элементами календаря каждого объекта Exchange Server (пользователя или ресурса).

Вотнекоторые полезные скриптлеты PowerShell для установки разрешений для пользователя и повторного выполнения операции удаления.

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

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

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...