В моем случае для работы разного рода рассылок пользователям в настройках того или иного функционала указываются SMTP-адреса, обычно привязанные к локальной (офисной) почтовой системе. При этом, если почтовый адрес указан некорректно, то сообщения по нему, очевидно, доставлены не будут, и посыпятся ошибки от Exchange Server'а. Чтобы снизить вероятность ошибочного указания в настройках несуществующего в домене почтового адреса, был создан вспомогательный класс ADS_tools, обращающийся к Active Directory (AD) и ищущий там кого-либо с таким email'ом. У класса есть один статический метод:
X++:
public static boolean isEmailPresentInAD(email _email, str _namingContext = '')
Первый параметр - SMTP-адрес для проверки (NB! если в поле настройки указывается несколько адресов через разделитель, "скармливать" их методу надо по одному), второй - контекст именования, который будет использоваться в LDAP-запросе для проверки. В большинстве случаев лучше оставить значение этого параметра пустым, тогда метод сам получит нужный контекст, соответствующий текущему домену по умолчанию. Искомым объектом может быть пользователь, контакт, группа и проч. В AD для пользователей и контактов могут быть заведены в т.ч. внешние SMTP-адреса, относящиеся к сторонним почтовым системам, - в этом случае проверка такого адреса пройдет успешно, но возможность доставки почты по нему не может быть гарантирована.
Изначально адреса искались в свойстве proxyAddresses объектов AD, однако, недавно я столкнулся со случаем, когда это свойство в одном домене заполнено не было (возможно, из-за "особенностей" администрирования Exchange Server'а). Чтобы обойти эту ситуацию, была добавлена также проверка свойства mail, хотя в нем может быть указан лишь один адрес, в то время как в proxyAddresses - несколько. При желании это свойство можно исключить из поискового запроса, тогда он будет выглядеть не так:
PHP код:
(&(|(objectCategory=person)(objectCategory=group))(|(proxyAddresses=SMTP:%3)(mail=%3)))
а так:
PHP код:
(&(|(objectCategory=person)(objectCategory=group))(proxyAddresses=SMTP:%3))
Еще из особенностей класса:
- поиск идет лишь в текущем домене и его поддоменах - перебор других доступных доменов из леса либо доменов, с которыми установлены доверительные отношения, не реализован;
- используется COM, а не .NET - код писался довольно давно, зато если выкинуть упоминания InteropPermission и AifUtil, он заработает и на 3-ке;
- свойство RunOn стандартного класса CCADOCommand переделано из Client в CalledFrom, как было в 3.0.