Календарь EWS API - выдача себя за обновление вызывает ошибку Доступ запрещен. Проверьте учетные данные и попробуйте еще раз.

Я новичок в использовании управляемых API EWS.

Ниже приводится проблема, с которой я сталкиваюсь с EWS API: EWS API - выдача себя за обновление элемента календаря, созданного любым другим пользователем, кроме учетной записи службы, вызывает ошибку «Доступ запрещен. Проверьте учетные данные и повторите попытку».

Подробности: 1. Я использую учетную запись службы, например. [email protected]. Этот пользователь является глобальным администратором, и ему также назначена роль ApplicationImpersonation. (Войдите в учетную запись Online Office 365 -> Администратор -> выберите вкладку «Exchange» -> выберите Разрешения на левой панели -> создайте роль олицетворения -> назначьте ApplicationImpersonation в ролях: и [email protected] в членах: - > Нажмите "Сохранить")

  1. Создайте элемент календаря другим пользователем, например, [email protected] и пригласите участника - [email protected].

  2. В программе на 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;
    }
    
  3. Он работал нормально до вчерашнего дня. Внезапно он начал выдавать исключение «Доступ запрещен. Проверьте учетные данные и повторите попытку». Каждый раз, когда я пытаюсь обновить это событие.

    частный статический 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);
        }
    }
    
  4. Что здесь может быть проблемой? Сначала я подумал, что это может быть политика дросселирования, которая останавливает того же пользователя после установления определенных ограничений на вызов API в течение дня, но я все еще вижу эту проблему сегодня.

Любая помощь приветствуется.

Спасибо


person snstuff    schedule 09.05.2014    source источник


Ответы (2)


Нашел решение:

Только добавление олицетворенного идентификатора к существующему экземпляру службы не работает. Вам также необходимо повторно подтвердить URL-адрес автоматического обнаружения.

person snstuff    schedule 12.05.2014
comment
У вас такая же проблема, но вы не совсем понимаете, как вы ее решили. Не могли бы вы добавить дополнительную информацию к своему ответу? - person Emaborsa; 05.06.2019

Я занимался проблемой выдачи себя за другое лицо + Календарь и нашел это сообщение на форуме.

Я уверен, что ваша проблема заключается в том, как вы пытаетесь получить, а затем обновить элемент календаря (встречу).

Вы получаете элемент календаря, используя учетные данные (почтовый ящик A). Затем, позже, в следующей строке

Impersonate(masterItem.Organizer.Address.ToString());

вы даете указание объекту службы Ews работать как олицетворенная личность (учетные данные почтового ящика B).

Поскольку вы уже получили встречу из почтового ящика A и теперь пытаетесь обновить эту встречу в почтовом ящике A, используя учетные данные почтового ящика B, это не должно работать, ИМХО, если у почтового ящика B нет разрешения на календарь почтового ящика A.

Итак, здесь, на самом деле, вы пытаетесь обновить элемент календаря в почтовом ящике A, используя олицетворенные учетные данные почтового ящика B, а поскольку у почтового ящика B нет разрешения на учетные данные почтового ящика A, возникает ошибка Доступ запрещен.

Надеюсь, это тоже поможет кому-то другому. Спасибо

person Laeeq Qazi    schedule 03.05.2020