使用C#中的电子邮件地址在AD中搜索分发列表

时间:2019-01-07 23:23:08

标签: c# active-directory directoryservices

我正在尝试验证活动目录中的电子邮件地址。我偶然发现了使用System.DirectoryServices的解决方案。现在,我可以验证普通用户,但是此代码不适用于通讯组。

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

我在这里做错了什么?我要验证的通讯组的名称如“我的组”和别名“ mygroup”。如果我做类似的事情,就可以找到该小组

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

问题是,即使我这样做,我也无法在其属性中找到其电子邮件。更大的问题是,在我的代码中,我将没有该组的cn,而只有用于搜索的电子邮件别名。

有什么想法吗?预先感谢!

2 个答案:

答案 0 :(得分:1)

在Active Directory中,“邮件”是一个包含电子邮件地址的单值属性。有一个多值属性proxyAddresses,其中包含条目的电子邮件地址的 all ,而Exchange实际使用的是该值。虽然大多数用户在mail和proxyAddresses中都存在一个电子邮件地址,但情况并非总是如此。针对邮件验证电子邮件地址会产生错误的错误。例如,在我工作的地方,更改姓名的人会将其旧电子邮件地址在proxyAddresses中保留90天,以允许他们将新地址传达给联系人。它仍然是个人的有效地址,但是 just 在邮件中查看时会指出该地址无效。

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());
            }

        }

答案 1 :(得分:0)

我联系了IT部门,结果发现我要搜索的组不在AD中,而是在Office 365中!我可以通过电子邮件地址找到的组存在于AD中。我想我现在需要研究Office 365 API。

这仍然无法向我解释为什么我能够使用其名称找到该小组!

我最初用于搜索组的逻辑是正确的,尽管它使用邮件作为过滤器,并且显然proxyaddrresses更准确,所以我将@LisaJ的响应标记为答案。