Я новичок в использовании управляемых API EWS.
Ниже приводится проблема, с которой я сталкиваюсь с EWS API: EWS API - выдача себя за обновление элемента календаря, созданного любым другим пользователем, кроме учетной записи службы, вызывает ошибку «Доступ запрещен. Проверьте учетные данные и повторите попытку».
Подробности: 1. Я использую учетную запись службы, например. [email protected]. Этот пользователь является глобальным администратором, и ему также назначена роль ApplicationImpersonation. (Войдите в учетную запись Online Office 365 -> Администратор -> выберите вкладку «Exchange» -> выберите Разрешения на левой панели -> создайте роль олицетворения -> назначьте ApplicationImpersonation в ролях: и [email protected] в членах: - > Нажмите "Сохранить")
Создайте элемент календаря другим пользователем, например, [email protected] и пригласите участника - [email protected].
В программе на C # я подключаюсь к службе EWS, используя учетную запись службы - [email protected], и получаю ее события календаря. Если организатором мероприятия является другой пользователь - [email protected], то я использую олицетворение следующим образом, чтобы обновить свойства события / элемента календаря - тему, основной текст и т. Д.
private static void Impersonate(string organizer) { string impersonatedUserSMTPAddress = organizer; ImpersonatedUserId impersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, impersonatedUserSMTPAddress); service.ImpersonatedUserId = impersonatedUserId; }
Он работал нормально до вчерашнего дня. Внезапно он начал выдавать исключение «Доступ запрещен. Проверьте учетные данные и повторите попытку». Каждый раз, когда я пытаюсь обновить это событие.
частный статический void FindAndUpdate (служба ExchangeService) {CalendarView cv = new CalendarView (DateTime.Now, DateTime.Now.AddDays (30)); cv.MaxItemsReturned = 25; попробуйте {FindItemsResults masterResults = service.FindItems (WellKnownFolderName.Calendar, cv);
foreach (Appointment item in masterResults.Items) { if (item is Appointment) { Appointment masterItem = item as Appointment; if (!masterRecurEventIDs.Contains(masterItem.ICalUid.ToString())) { masterItem.Load(); if (!masterItem.Subject.Contains(" (Updated content)")) { //impersonate organizer to update and save for further use Impersonate(masterItem.Organizer.Address.ToString()); // Update the subject and body masterItem.Subject = masterItem.Subject + " (Updated content)"; string currentBodyType = masterItem.Body.BodyType.ToString(); masterItem.Body = masterItem.Body.Text + "\nUpdated Body Info: xxxxxxxxxxxx"; // This results in an UpdateItem operation call to EWS. masterItem.Update(ConflictResolutionMode.AutoResolve); // Send updated notification to organizer of an appointment CreateAndSendEmail(masterItem.Organizer.Address.ToString(), masterItem.Subject); masterRecurEventIDs.Add(masterItem.ICalUid.ToString()); } else { Console.WriteLine("Event is already updated. No need to update again.:\r\n"); Console.WriteLine("Subject: " + masterItem.Subject); Console.WriteLine("Description: " + masterItem.Body.Text); } } } } } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } }
Что здесь может быть проблемой? Сначала я подумал, что это может быть политика дросселирования, которая останавливает того же пользователя после установления определенных ограничений на вызов API в течение дня, но я все еще вижу эту проблему сегодня.
Любая помощь приветствуется.
Спасибо