Получить все данные пользователя из Exchange Server 2010

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

Я уже искал на сайтах MS, загрузил «Образцы кода Exchange 2013 101» и успешно написал сценарий, который отправляет электронное письмо другому пользователю, но аутентификация работала только с учетными данными пользователя.

Можно ли создать «главного» пользователя, который может читать все календари и контакты данного списка пользователей? Может ли ExchangeServer вызвать мое приложение и отправить информацию (например, с помощью SOAP) или мне нужно провести опрос?


ОБНОВИТЬ:

Я создал пользователя, который имеет полное право на все, но я не знаю, как читать данные с сервера, потому что календарь «главного» пользователя пуст. Когда я посещаю OWA и решу заглянуть в чей-то календарь, я могу увидеть встречи.

Код для разрешений:

Get-Mailboxdatabase | Add-ADPermission -AccessRights ExtendedRight -ExtendedRights Receive-As, Send-As -User "<SuperAccount>"

А этот делится календарем:

Add-MailboxFolderPermission –Identity <MailboxFolderId>:\Calendar -AccessRight ReadItems -User <SuperAccount>

Как я могу получить календарь пользователя с моим мастер-пользователем?


person Pixelmonster    schedule 05.07.2013    source источник


Ответы (2)


Используемый нами подход заключается в том, что все пользователи должны предоставлять доступ к своим календарям «главному» пользователю с полными правами редактирования. Этот пользователь должен быть создан в домене сервера. Наш код входит в Exchange как главный пользователь и получает доступ ко всем календарям.

Другой подход, с которым у меня нет опыта, это Олицетворение. Exchange позволяет вам выступать в качестве другого пользователя. Для этого у вас должны быть права на олицетворение в Windows.

person Jan Doggen    schedule 05.07.2013
comment
Я наконец решил эту проблему с олицетворением. Это действительно просто, но очень мощно, и я могу оставить остальную часть своего кода, потому что это всего лишь еще одна строка. - Большое спасибо! - person Pixelmonster; 05.07.2013

Согласно ответу Яна Доггена, я нашел решение в другом потоке StackOverflow, который можно найти здесь: EWS: общий доступ календари

Ответ от Seph был на Visual Basic, но его можно легко преобразовать в C#:

using Microsoft.Exchange.WebServices.Data;

DateTime startTime = new DateTime(2013, 1, 1);
DateTime endTime = new DateTime(2013, 12, 31);

var cal = new FolderId(WellKnownFolderName.Calendar, new Mailbox("other user's email"));
var calendarView = new CalendarView(startTime.Date, endTime.Date.AddDays(1));

foreach (var appointmentItem in service.FindAppointments(cal, calendarView))
{
    Console.WriteLine(appointmentItem.Subject);
}
person Pixelmonster    schedule 05.07.2013
comment
При попытке использовать этот код выдает Указанная папка не найдена в магазине. - person Paige Watson; 10.01.2014
comment
Прошу прощения за мой поздний ответ. К сожалению, я больше не работаю над этим проектом, потому что это была только летняя работа, а я учусь. Вы используете ту же версию Exchange Server? WellKnownFolderName.Calendar — это общее имя папки, которое применяется к вашему серверу. Используете ли вы правильную версию ews-managed-api? Вы выбрали правильную версию Exchange в Visual Studio? - person Pixelmonster; 29.03.2014
comment
Н.П., кажется, я разобрался, хотя я не работал над проектом несколько месяцев. Спасибо за ответ. - person Paige Watson; 16.04.2014