Как узнать, есть ли у пользователя почтовый ящик на Exchange с использованием C # или PowerShell - PullRequest
0 голосов
/ 05 ноября 2018

Мы разработали веб-часть SharePoint, которая отображает элементы календаря выбранных пользователей, запросив Exchange OnPrem 2013 или Exchange Online для пользователей, которые имеют свой почтовый ящик в Office 365. Мы используем следующий код:

// Impersonate the Search
ExchangeImpersonationType exchangeImpersonationType = new ExchangeImpersonationType();

ConnectingSIDType connectingSIDType = new ConnectingSIDType();
connectingSIDType.PrimarySmtpAddress = emailAddress;
exchangeImpersonationType.ConnectingSID = connectingSIDType;
exchangeServiceBinding.ExchangeImpersonation = exchangeImpersonationType;

// Create the Request
FindItemType findItemType = new FindItemType();

// Specified Transversal
findItemType.Traversal = ItemQueryTraversalType.Shallow;

// Specified ItemShape
ItemResponseShapeType itemResponseShapeType = new ItemResponseShapeType();
itemResponseShapeType.BaseShape = DefaultShapeNamesType.AllProperties;
findItemType.ItemShape = itemResponseShapeType;

// Specified ParentFolderIds
DistinguishedFolderIdType[] distinguishedFolderIdTypes = new DistinguishedFolderIdType[1];
distinguishedFolderIdTypes[0] = new DistinguishedFolderIdType();
distinguishedFolderIdTypes[0].Id = DistinguishedFolderIdNameType.calendar;
findItemType.ParentFolderIds = distinguishedFolderIdTypes;

// Specified Item
CalendarViewType calendarViewType = new CalendarViewType();
calendarViewType.StartDate = startDate;
calendarViewType.EndDate = endDate;

findItemType.Item = calendarViewType;

// Execute the Request
FindItemResponseType res = exchangeServiceBinding.FindItem(findItemType);

Проблема в том, что когда у пользователя нет почтового ящика в Exchange OnPrem, метод exchangeServiceBinding.FindItem через 3–5 секунд отвечает с кодом ошибки «UserHasNoMailbox».

Представьте, что сейчас загружается страница с более чем 40 пользователями, среди которых 10 пользователей, у которых есть почтовый ящик в Exchange Online, в этом случае мы теряем не менее 30 секунд.

Можно ли узнать, есть ли у пользователя почтовый ящик в Exchange OnPrem, не отправив запрос FindItem?

Спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Возможный обходной путь - вы можете искать локальные почтовые ящики в Active Directory. Вот фрагмент кода Power Shell (можно легко преобразовать его в C #)

$mail = "FirstName.LastName@yourorg.com"
([adsisearcher]"(&(objectCategory=person)(objectClass=organizationalPerson)(mail=$mail))").FindOne().Properties

Этот поиск должен быть довольно быстрым (по крайней мере, по сравнению с 3-5 секундами). Если вы получаете какой-либо результат, вы можете выполнить «FindItem» на месте, если не проверить его на Exchange Online.

Если существует группа AD или Exchange DL, членами которой являются все эти электронные письма, вы можете сначала извлечь список членов группы из AD (вместо многократного выполнения запроса выше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...