通过电子邮件地址在ActiveDirectory中查找用户

14

我如何通过电子邮件地址查询ActiveDirectory用户?给定的用户可以有多个电子邮件地址,例如john.smite@acme.com和jsmith@acme.com。对于给定的电子邮件地址,如何找回A/D用户?

我正在使用C#编程。

2个回答

25

您可以使用以下代码搜索您的AD:

    DirectoryEntry adEntry = null;

    private void SetADInfoAndCredentials()
    {
        adEntry = new DirectoryEntry("LDAP://" + ad_textBox.Text);
        adEntry.Username = user_textBox.Text;
        adEntry.Password = pw_textBox.Text;
    }

    private void SearchForMailInAD()
    {
        DirectorySearcher adSearcher = new DirectorySearcher(adEntry);
        adSearcher.Filter = ("mail=" + mail_textBox.Text);
        SearchResultCollection coll = adSearcher.FindAll();
        foreach (SearchResult item in coll)
        {
            foundUsers_listBox.Items.Add(item.GetDirectoryEntry());
        }
    }

€:这将在proxyAddresses中搜索邮件地址,该属性包含所有邮件地址。

    public static SearchResultCollection FindAccountByEmail(string pEmailAddress)
    {
        string filter = string.Format("(proxyaddresses=SMTP:{0})", email);

        using (DirectoryEntry gc = new DirectoryEntry("LDAP:"))
        {
            foreach (DirectoryEntry z in gc.Children)
            {
                using (DirectoryEntry root = z)
                {
                    using (DirectorySearcher searcher = new DirectorySearcher(root, filter, new string[] { "proxyAddresses", "objectGuid", "displayName", "distinguishedName" }))
                    {
                        searcher.ReferralChasing = ReferralChasingOption.All;
                        SearchResultCollection result = searcher.FindAll();

                        return result;
                    }
                }
            }
        }
        return null;
    }

谢谢 - 第二个代码集非常好用。我什么时候需要使用第一个(LDAP)方法?LDAP://后面该填什么? - David Thielen
1
第一段代码只有在确切知道主邮件地址被定义的情况下才能工作。在使用LDAP之后,您必须可以设置您的域或控制器。 - Daniel Abou Chleih
为什么要使用 foreach 循环?您在第一次迭代中就返回了一个值。 - MatterOfFact
1
你是怎么想到要使用过滤器 mail= 的?难道 AD 不是将电子邮件存储在 E-mail 下吗? - Yousuf Khan

2

我不确定我是否漏掉什么,但是根据电子邮件地址查找AD用户可以更简单地完成:

var context = new PrincipalContext(ContextType.Domain);
var userPrincipal = UserPrincipal.FindByIdentity(context, emailAddress);

3
为什么这只适用于用户名而不适用于电子邮件? - Marko Pavic
因为它不能通过电子邮件工作,我不知道为什么有人点赞这个。 - undefined
显然对我来说是有效的。这可能是因为我正在使用的AD使用电子邮件地址作为UPN吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接