Active Directory,未找到邮件属性

时间:2018-04-19 15:56:18

标签: c# active-directory ldap exchange-server

我希望使用C#编写的应用程序定期更新数据库中的用户表,其中包含Active Directory上所有用户的名称和电子邮件地址。我使用DirectorySearcher检索用户。

 DirectorySearcher dirSearch = new DirectorySearcher();
 dirSearch.Filter = "(&(objectClass=user)(objectCategory=person))";
 dirSearch.PropertiesToLoad.Add("mail");
 SearchResultCollection resultCol = dirSearch.FindAll();

这会返回系统上的用户列表,但只返回一个用户的电子邮件地址。

我承认我在Active Directory和IT管理员等方面的经验有限。我们正在寻找正确的位置来检索此类信息吗?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

Active Directory可能可选。意思是,它们可能存在或者可能不存在。

这与关系数据库有很大不同,在关系数据库中,将始终为记录返回所有列(尽管它们可能包含null个值)。

因此,在您的情况下,只有一个用户拥有电子邮件地址,您可能会认为缺少值为null

答案 1 :(得分:0)

首先在评论中回答您的问题,是Active Directory链接到Exchange。事实上,Exchange高度依赖Active Directory,99%的Exchange用户级别设置都存储在Active Directory中。 Exchange使用AD作为其用户设置数据库,如果查看AD中的用户属性列表,您可以找到以" msexch"开头的数十个属性名称。

回到主要问题,邮件不是Exchange服务器使用的电子邮件地址的正确属性。您需要查询的正确AD属性是 proxyaddresses 。请注意它是一个多值属性,因为用户可以拥有多个电子邮件地址。例如,如果它是我的帐户:

smtp:dongmao@company.com
smtp:dong_mao@company.com
SMTP:maodong@company.com
smtp:mao_dong@company.com

使用大写SMTP的地址是主电子邮件地址,而其他地址都是次要的。如果您想向我发送电子邮件,可以使用所有这些。

总之,要实现你想要的目标

  • 搜索属性 proxyaddresses
  • 稍微更新您的代码以使其处理多值AD字段
  • 您决定是仅存储主电子邮件地址还是将所有地址存储到数据库中。如果仅限主要,则过滤掉地址以大写SMTP开头。

然后使用什么邮件属性?

  • 它是AD中的联系人属性,用于提供必要的联系信息。就像电话号码,手机号码,办公室,物理地址等一样。它在您的组织中没有安装任何电子邮件系统。

  • 在早期版本的Exchange(< 2007)中,Exchange始终保持邮件和主SMTP地址的值同步。从Exchange 2007启动,Exchange仅在Exchange管理员运行Set-Mailbox时执行同步操作。因此,它们可能不同步,或者用户的价值可能是空白的。