我正在尝试验证活动目录中的电子邮件地址。我偶然发现了使用System.DirectoryServices的解决方案。现在,我可以验证普通用户,但是此代码不适用于通讯组。
DirectorySearcher search = new DirectorySearcher(filter: "(mail="+username+"*)");
SearchResultCollection results = search.FindAll();
我在这里做错了什么?我要验证的通讯组的名称如“我的组”和别名“ mygroup”。如果我做类似的事情,就可以找到该小组
DirectorySearcher search = new DirectorySearcher(filter: "cn=My Group");
问题是,即使我这样做,我也无法在其属性中找到其电子邮件。更大的问题是,在我的代码中,我将没有该组的cn,而只有用于搜索的电子邮件别名。
有什么想法吗?预先感谢!
答案 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的响应标记为答案。