Удаление календарной встречи у всех пользователей с помощью EWS Managed API

#c# #exchangewebservices #office365 #appointment

#c# #exchangewebservices #office365 #назначение

Вопрос:

У меня есть приложение, которое создает встречи в календарях в Exchange Online для Office 365. Я использую EWS Managed API.

 public void CreateAppoitment(string principalName, int taskId) {
  ExchangeService service = createService(principalName);

  ItemView itemView = new ItemView(1000);
  itemView.PropertySet = new PropertySet(BasePropertySet.IdOnly);

  List<Appointment> toCreate = new List<Appointment>();

  // Create the appointment.
  Appointment appointment = new Appointment(service);

  // Set properties on the appointment.
  appointment.Subject = "Test Appointment";
  appointment.Body = "The appointment ...";
  appointment.Start = new DateTime(2014, 6, 18, 9, 0, 0);
  appointment.End = appointment.Start.AddDays(2);

  ExtendedPropertyDefinition epdTaskId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Appointment, "TASK_Id", MapiPropertyType.Integer);
  appointment.SetExtendedProperty(epdTaskId, taskId);
  appointment.IsResponseRequested = false;
  toCreate.Add(appointment);
  ServiceResponseCollection<ServiceResponse> createResponse = service.CreateItems(toCreate, WellKnownFolderName.Calendar, MessageDisposition.SaveOnly, SendInvitationsMode.SendToNone);
}
  

Обратите внимание, что я устанавливаю расширенное определение свойств «TASK_Id»

Я использую impersonate для создания встреч в календарях пользователей:

 private ExchangeService createService(string principalName) {
  ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
  service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
  service.UseDefaultCredentials = false;
  service.Credentials = new WebCredentials("XXXX", "YYYY");
  service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.PrincipalName, principalName);

  return service;
}
  

Затем, учитывая идентификатор задачи, я хочу удалить все встречи с этим идентификатором задачи:

 public void DeleteAppointment(string principalName, int appointmentId) {
  ExchangeService service = createService(principalName);
  ItemView itemView = new ItemView(1000);
  itemView.PropertySet = new PropertySet(BasePropertySet.IdOnly);

  ExtendedPropertyDefinition epdTaskId = new ExtendedPropertyDefinition(
    DefaultExtendedPropertySet.Appointment, "TASK_Id", MapiPropertyType.Integer);

  SearchFilter filterOnTaskId = new SearchFilter.IsEqualTo(epdTaskId, appointmentId);
  FindItemsResults<Item> appointments = service.FindItems(WellKnownFolderName.Calendar, filterOnTaskId, itemView);
  List<ItemId> toDelete = appointments.Select(item => item.Id).ToList();
  if (toDelete.Count > 0) {
    ServiceResponseCollection<ServiceResponse> response = service.DeleteItems(
      toDelete, DeleteMode.MoveToDeletedItems, SendCancellationsMode.SendToNone,
      AffectedTaskOccurrence.SpecifiedOccurrenceOnly);

    foreach (ServiceResponse del in response) {
      if (del.Result == ServiceResult.Error) {
        //...
      }
    }
  }
}
  

Но этот способ обслуживания.FindItems() возвращает только назначение имени принципала с помощью TASK_Id = TaskId, а мне нужны назначения всех пользователей. Есть ли способ сделать это?

Ответ №1:

Управляемый API Exchange и веб-службы Exchange предоставляют доступ к календарю только одному пользователю одновременно — либо напрямую, используя учетные данные пользователя, либо косвенно, используя олицетворение, чтобы предоставить учетной записи службы доступ к календарю пользователя.

Для одновременного поиска по нескольким календарям требуется другой метод. Один из вариантов, который приходит на ум, — это использование операций обнаружения электронных данных в Exchange 2013. Хотя они обычно используются для поиска электронной почты по юридическим причинам, вы можете использовать тот же процесс. К сожалению, документация по обнаружению электронных данных сейчас довольно скудна, но вы можете увидеть операции EWS, доступные здесь: Обнаружение электронных данных в EWS в Exchange, и вы можете найти соответствующие методы EWS Managed API в объекте ExchangeService.