【问题标题】:Get Email Addresses From Exchange Given DirectoryEntry从给定 DirectoryEntry 的 Exchange 获取电子邮件地址
【发布时间】:2014-11-04 20:03:44
【问题描述】:

我正在遍历我们 AD 环境中的所有用户,并读取他们的电子邮件地址,以便我可以在另一个系统中更新它。我正在使用System.DirectoryServices 库。下面的简化示例。我发现mail 属性并不总是正确的,即使用户在 Exchange 中具有有效的邮箱设置和功能,它也经常丢失。所以,问题是,给定DirectoryEntry,除了读取mail 属性之外,还有什么方法可以从Exchange 列出用户的主要电子邮件地址(最好是任何别名)?我见过一些examples that use the proxyAddresses attribute,但这些似乎也不可靠。我正在寻找直接来自 Exchange 的解决方案。没有如果-and-or-buts。这是他们的电子邮件地址。

DirectorySearcher search = new DirectorySearcher("(&(mail=*))");
search.PageSize = 1000;
search.PropertiesToLoad.Add("mail");
foreach( SearchResult result in search.FindAll() )
{
    DirectoryEntry entry = result.GetDirectoryEntry();
    Console.WriteLine(entry.Properties["mail"].Value);
}

【问题讨论】:

  • 您是否熟悉PrincipalContext,您也可以通过这种方式获得域上的电子邮件地址。也可以通过代码将这一行entry.Properties["mail"].Value更改为以下entry.Properties["mail"].Value.ToString();
  • @DJKRAZE 只读取mail 属性。
  • 您是否尝试过使用 PrincipalContext 来获取所有用户的列表,或者至少使用您的用户名尝试它,这将是您在网络上使用的 SamAccount 名称.. 您会看到它将返回电子邮件地址查找有关如何使用 PrincipalContext 获取所有 AD 用户的示例
  • @DJKRAZE,伙计,代码没有问题。我可以查看 AD 用户和计算机并看到属性为空白。 PrincipalContext 仍然只会读取 mail 属性。底线是不能依赖mail 属性。我需要直接与 Exchange 交互的东西。
  • 试试这里给出的网络服务建议stackoverflow.com/questions/9705951/…

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


【解决方案1】:

Exchange 没有用于此数据的单独数据存储。它存储在 AD 中。如果您通过 Exchange API(EWS 或 PowerShell)收集数据,您最终将获得相同的数据。 proxyAddresses 属性是在 AD 中查找的位置。

【讨论】:

    【解决方案2】:

    根据this

    这取决于创建对象时设置了哪些属性以及它是什么类型的对象:

    对于邮箱 (objectClass=user),如果设置了 proxyAddress、mail 或 textEncodedOrAccess 中的任何一个,exchange 将不会设置任何值,如果未设置值,exchange 将设置所有值。

    对于启用邮件的对象(objectClass=user & objectClass=contact),targetAddress 是强制性的,并且同样的规则适用于其他三个。

    【讨论】:

    • 我们的环境中几乎没有用户对象具有targetAddress 属性集。
    【解决方案3】:

    Exchange 保存电子邮件和别名。 循环遍历您的 AD 并使用 Microsoft.Exchange.WebServices.dll 来查找交换用户。然后用他们的电子邮件地址和别名做你想做的事:)

    【讨论】:

      【解决方案4】:

      有一种简单的方法可以知道在 AD 中哪个属性用于 Active Directory 属性 虽然这是一项手动工作,但是在浏览了一些示例之后,您将了解用于保存电子邮件值的所有属性

      下面,您可以遍历某些用户的属性名称,并尝试注意哪个属性包含电子邮件值 在与不同用户进行多次尝试后,您将能够知道保存电子邮件并用于从整个 AD 获取电子邮件的不同属性名称

      DirectoryEntry directoryEntry = new DirectoryEntry(ConnectionString, ProviderUserName, ProviderPassword, AuthenticationTypes.Secure);
       /******************************/
      
       DirectorySearcher search = new DirectorySearcher(directoryEntry);
       search.Filter = "(&(objectClass=user)(sAMAccountName=" + username + "))";
       search.CacheResults = false;
      
       SearchResultCollection allResults = search.FindAll();
       StringBuilder sb = new StringBuilder();
      
       foreach (SearchResult searchResult in allResults)
       {
           foreach (string propName in searchResult.Properties.PropertyNames)
           {
               ResultPropertyValueCollection valueCollection = searchResult.Properties[propName];
               foreach (Object propertyValue in valueCollection)
               {
                   sb.AppendLine(string.Format("property:{0}, value{1}", propName, propertyValue));
               }
           }
       }
      
       return sb.ToString();
      

      您甚至可以使用它来获取一些在 AD 中无法直接找到的属性名称

      【讨论】:

      • 谢谢,但这没有帮助。这仍在从 LDAP 读取属性,正如我试图表达的那样,这并不准确。我需要直接与 Exchange 服务器通信的东西。
      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多