Управляемый API веб-служб Exchange: доступ к элементам других пользователей

Возможно ли получить доступ к папкам и элементам других учетных записей Exchange, кроме учетной записи вошедшего в систему пользователя?

Могу ли я сделать это через управляемый API веб-служб Exchange?


person Luke    schedule 24.09.2010    source источник
comment
Вы используете EWS напрямую или через управляемый API EWS?   -  person Alfred Myers    schedule 24.09.2010
comment
@Alfred Myers Я использую управляемый API EWS   -  person Luke    schedule 27.09.2010


Ответы (3)


Да, это возможно, но вы должны знать пароль другого пользователя или каким-то образом получить эти учетные данные (объект NetworkCredential). Типичные первые строки вашего кода могут быть

ExchangeService myService = new ExchangeService (ExchangeVersion.Exchange2007_SP1);
myService.Credentials = new NetworkCredential ("[email protected]", "P@ssword00");

так что вы можете получить доступ к веб-службам Exchange Server с учетной записью, отличной от текущего пользователя. Дополнительную информацию см. В описании объекта ExchangeService.

Если вы являетесь администратором, вы можете сделать пользователя олицетворением по SMTP. адрес.

person Oleg    schedule 29.09.2010
comment
@Alfred Myers & @ user457261: Вы не написали ни одного комментария. Информация, которую я написал, вам нужна? - person Oleg; 04.10.2010
comment
Спасибо за ответ, но я искал способ обойтись без необходимости знать все пароли. Например, с помощью суперпользователя, который может получить доступ ко всем учетным записям. - person Luke; 08.10.2010
comment
@Luke: Последние предложения моего ответа описывают, как это сделать. В качестве суперадмина вы можете выдавать себя за любого пользователя только по SMTP-адресу, не имея никакой информации о его пароле. Посмотрите на msdn.microsoft.com/en-us/library /dd633680(EXCHG.80).aspx еще раз. - person Oleg; 08.10.2010
comment
Любой здесь увидит мой ответ, вам не нужно выдавать себя за другое лицо и вам не нужно знать пароль. - person Preston; 29.09.2014
comment
@Preston: Во-первых, мой ответ был написан 4 года назад. У EWS не было WebCredentials в то время. В то время управляемый API EWS был в версии 1.1 (или 1.2), а не 2.2, как сейчас. WebCredentials был представлен, начиная с EWS Managed API 2.0. Секунды будьте очень осторожны, если пишете, что что-то не так: использовать олицетворение неправильно. Даже если вы найдете альтернативный способ для доступа к учетным данным других пользователей для EWS Managed API 1.1, способ олицетворения все равно будет правильным. В то время это был единственный способ «Знай меня», рекомендованный Microsoft. - person Oleg; 30.09.2014
comment
@Preston: Кстати, если вы внимательно изучите документацию WebCredentials, вы обнаружите, что WebCredentials не более чем оболочка для NetworkCredential: WebCredentials обертывает экземпляр объекта T: System.Net.NetworkCredential (см. здесь). - person Oleg; 30.09.2014
comment
@Oleg Извините, но, учитывая воинственную идеологию SE в репостах, это нужно исправить, так как никто не сможет попросить получить обновленный ответ. - person Preston; 30.09.2014
comment
@Preston: Вы можете задать новый вопрос о возможностях аутентификации в EWS Managed API 2.2 или 2.0. Вы даже можете опубликовать свой собственный ответ там, где вы пишете: начиная с версии xy существует лучший способ ... (ваш текущий ответ не содержит информации о версии) В любом случае такое утверждение, как использование олицетворения, неверно также в кейс. Я рекомендую вам быть очень осторожными, если вы хотите заявить, что что-то не так. Вы должны быть осторожны и при отрицательном голосовании. - person Oleg; 30.09.2014

Знать пароль неправильно, а использовать олицетворение (в наши дни) неправильно.

Вот как ты это делаешь.

        ExchangeService _service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
        //CREDENTIALS OF AN ACCOUNT WHICH HAS READ ACCESS TO THE CALENDAR YOU NEED
        _service.Credentials = new WebCredentials(username, password);
        _service.Url = new Uri(serviceURL);

        SearchFilter.SearchFilterCollection searchFilter = new SearchFilter.SearchFilterCollection();
        searchFilter.Add(new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, DateTime.Now.AddDays(-1)));
        searchFilter.Add(new SearchFilter.IsLessThanOrEqualTo(AppointmentSchema.Start, DateTime.Now.AddDays(2)));
        ItemView view = new ItemView(50);
        view.PropertySet = new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.AppointmentType, AppointmentSchema.End);

        //THIS NEXT LINE!!!
        var calendarSearch = new FolderId(WellKnownFolderName.Calendar, new Mailbox("[email protected]"));
        var appointments = _service.FindItems(calendarSearch, searchFilter, view);
person Preston    schedule 29.09.2014
comment
Это гораздо лучший ответ, именно то, что я так долго искал - person Nacht; 03.07.2015

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

Перед олицетворением у вас есть одно имя пользователя и пароль вместо x имен пользователей и паролей.

Вы можете использовать олицетворение следующим образом:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
service.Credentials = new NetworkCredential(appName, appPassword, emailDomain);
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, userToImpersonate);

когда у пользователя есть делегированный доступ другому пользователю, вы можете получить доступ к папке другого пользователя. Например: человек A будет выдавать себя за другое лицо и сможет получить доступ к человеку B

person eL-Prova    schedule 23.08.2012