Поиск списка рассылки в AD, используя адрес электронной почты в C # - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь подтвердить адрес электронной почты в активном каталоге. Я наткнулся на решение с использованием System.DirectoryServices. Теперь я могу проверить обычного пользователя, но этот код не работает для группы рассылки.

DirectorySearcher search = new DirectorySearcher(filter: "(mail="+username+"*)");
SearchResultCollection results = search.FindAll();

Что я здесь не так делаю? Группа рассылки, которую я пытаюсь проверить, имеет имя типа «Моя группа» и псевдоним «моя группа». Я могу найти группу, если сделаю что-то вроде

DirectorySearcher search = new DirectorySearcher(filter: "cn=My Group");

Проблема в том, что даже если я это сделаю, я не могу найти его адрес электронной почты в его свойствах. И большая проблема в моем коде - у меня не будет cn для группы, только псевдоним электронной почты для поиска.

Есть идеи? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я связался с ИТ и оказалось, что группа, которую я искал, не в AD, а в офисе 365! Группы, которые я могу найти по адресам электронной почты, существуют в AD. Полагаю, мне нужно изучить API-интерфейсы Office 365.

Это все еще не объясняет мне, почему я смог найти группу, используя ее имя!

Логика, которую я изначально использовал для поиска в группе, была правильной, хотя она использовала почту в качестве фильтра и, несомненно, прокси-адреса более точны, поэтому я отмечаю ответ @ LisaJ как ответ.

0 голосов
/ 08 января 2019

В Active Directory «почта» - это атрибут с одним значением, который содержит адрес электронной почты. Существует многозначный атрибут proxyAddresses, который содержит все адресов электронной почты записи, и именно это значение фактически используется Exchange. Хотя большинство пользователей имеют один адрес электронной почты, который присутствует и в mail, и в proxyAddresses, это не всегда так. Проверка адресов электронной почты по почте может привести к ложным сбоям. Например, когда я работаю, кто-то, кто меняет свое имя, сохраняет свой старый адрес электронной почты в proxyAddresses в течение 90 дней, чтобы позволить им сообщить свой новый адрес контактам. Это все еще действительный адрес для человека, но просто , просматривающий почту, скажет, что адрес недействителен.

Значения в proxyAddresses начинаются с префикса транспорта (как правило, «smtp», так как преобладание почтового потока основано на SMTP ... хотя возможно, что используется какой-то другой транспорт - ищите известную запись и возвращайте proxyAddresses, чтобы увидеть что используется в вашей директории).

Предполагая, что SMTP является транспортом, фильтр для поиска учетной записи по одному из значений proxyAddresses:

(&(proxyAddresses=smtp:me@example.com))

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

        static void Main(string[] args)
        {
            DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://ADServer.example.com","lisa@example.com","!P@ssw0rdG03sH3r3!", AuthenticationTypes.Secure);
            DirectorySearcher searcher = new DirectorySearcher(directoryEntry)
            {
                PageSize = int.MaxValue,
                //                Filter = "(&(mail=LJRTestDistroGroup@example.com))"
                                Filter = "(&(proxyAddresses=smtp:LJRTestSecurityGroup@example.com))"
            };

            searcher.PropertiesToLoad.Add("displayName");
            searcher.PropertiesToLoad.Add("proxyAddresses");
            searcher.PropertiesToLoad.Add("mail");

            SearchResultCollection result = searcher.FindAll();

            List<string> names = new List<string>();

            foreach (SearchResult r in result)
            {
                Console.WriteLine(r.Properties["displayname"][0].ToString());
                Console.WriteLine(r.Properties["mail"][0].ToString());
                Console.WriteLine(r.Properties["proxyAddresses"][0].ToString());
            }

        }
...