Главная > C#, Интеграция, Exchange Server, Live@edu > Имперсонация – зачем и как?

Имперсонация – зачем и как?

Если Вы хотите записать студентам событие в календарь или показать количество непрочитанных сообщений в почтовом ящике Outlook Live пользователю, вошедшему на учебный портал, то совершенно не обязательно знать его пароль, чтобы получить данные из почтового ящика! Достаточно воспользоваться функцией имперсонации.
Для того, чтобы обеспечить такую возможность, Вам необходимо:
1. Настроить возможность имперсонации для идентификатора администратора в PowerShell (установка, настройка и подключение к серверу: http://help.outlook.com/ru-ru/140/cc546278.aspx ).
New-ManagementRoleAssignment -Name EWSadmin -Role ApplicationImpersonation —User ewsadmin@example.com
2. Загрузить Exchange Web Services Application Program Interface (EWS API) и установить на сервер с порталом
3. Добавить в проект ссылку на библиотеку: нажмите меню «Проект», пункт «Добавить ссылку…», вкладка «Обзор», выберите путь, куда Вы установили EWS API и дважды щелкните на файле Microsoft.Exchange.WebServices.dll.
4. Сослаться в коде на библиотеку
using Microsoft.Exchange.WebServices.Data;
5. Создать код имперсонации (можно выделить в отдельный метод или функцию):
string ewsAdmin = “ewsadmin@example.com”; // пользователь с правами имперсонации
string ewsPassword = “Pa$$w0rd”; // пароль пользователя
string  memberNameIn = “user@example.com”; // пользователь, для которого нужно получить/изменить информацию
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
service.Credentials = new WebCredentials(ewsAdmin, ewsPassword);
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, memberNameIn);
service.Url = new Uri(«https://db2prd0102.outlook.com/ews/exchange.asmx«); // адрес можно узнать, войдя на outlook.com и посмотрев на адресную строку после отображения почты, либо смотрите окончание этой записи для использования функции автообнаружения
service.PreAuthenticate = true;
6. Добавить код для выполнения функций, например:
Создание события в календаре:
Appointment appointment = new Appointment(service);
appointment.Subject = “Демонстрационное событие”;
appointment.Body = new MessageBody();
appointment.Body.Text = “Текст события”;
appointment.Body.BodyType = (BodyType)Enum.Parse(typeof(BodyType), “text”);
appointment.Location = “Офис 210”;
appointment.Start = “2009-09-30T12:30:00”;
appointment.End = “2009-09-30T15:30:00”;
appointment.Save();
Отображение прочитанных / непрочитанных сообщений:
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox); // Подключение к папке “Входящие”
Response.Write(«Всего писем: » + inbox.TotalCount + «. Непрочтенных: » + inbox.UnreadCount); // Вывод сообщений
Вывод событий:
DateTime startDate = new DateTime(2010, 9, 1);

DateTime endDate = new DateTime(2011, 1, 31);

CalendarView calView =

new CalendarView(startDate, endDate);

calView.PropertySet =

new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.IsRecurring, AppointmentSchema.AppointmentType); FindItemsResults findResults = service.FindAppointments(WellKnownFolderName.Calendar, calView); foreach (Appointment appt in findResults.Items)

{

if (appt.AppointmentType == AppointmentType.Occurrence)

{

Console.WriteLine(String.Format(«{1}: {0}», appt.Subject.Substring(0, 20), appt.Start.ToString()));

}

else if (appt.AppointmentType == AppointmentType.Exception)

{

// Calendar item is an exception in a recurring series.

}

}

Вот и все! Студенты постоянно в курсе последних событий и наличия непрочтенных сообщений в своем ящике!
Дополнительная информация про EWS API: http://mamichev.spaces.live.com/blog/cns!DAD805F3381EED7B!2389.entry .

Более подробная инструкция

С инструкцией можно ознакомиться в MSDN: http://msdn.microsoft.com/en-us/library/dd637749(EXCHG.80).aspx (введение) и http://msdn.microsoft.com/en-us/library/dd633710(EXCHG.80).aspx (документация).

Автообнаружение сервиса

В некоторых ситуациях может потребоваться использование автообнаружения.
Потребуются два действия:
1. Необходимо сделать запись в DNS:
autodiscover.your_liveatedudomain.ru CNAME autodiscover.outlook.com
В некоторых системах управления DNS запись может выглядеть вот так:
autodiscover CNAME autodiscover.outlook.com.
Обратите внимание, требует ли Ваш DNS-провайдер точку в конце абсолютных адресов.
2. Слегка модифицировать код
Вместо строки
необходимо использовать следующий код

service.AutodiscoverUrl(tbUser.Text,
delegate(string url)

{
return MessageBox.Show(
«Do you want to allow a redirection to « + url + » ?»,
«Allow redirection?»,
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning) == DialogResult.Yes;
});
Обратите внимание, что вторым параметром в этом перегруженном методе используется функция проверки адреса пользователем. В данном примере (источник) используется диалог с запросом разрешения пользователя, но Вы можете автоматизировать запрос для «бесшумной» работы.

Оставьте комментарий