从Exchange Given DirectoryEntry获取电子邮件地址

时间:2014-11-04 20:03:44

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

我正在遍历AD环境中的所有用户,并阅读他们的电子邮件地址,以便我可以在另一个系统中更新它。我正在使用System.DirectoryServices库。以下是简化示例。我发现mail属性并不总是正确的,即使用户在Exchange中设置了有效的邮箱并且功能正常,它也经常丢失。所以,问题是,给定DirectoryEntry,除了阅读mail属性之外,还有什么办法可以从Exchange列出用户的主电子邮件地址(理想情况下是任何别名)吗?我见过一些examples that use the proxyAddresses attribute,但这些似乎也不可靠。我正在寻找直接来自Exchange的解决方案。关于它没有if-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);
}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

根据this

它取决于创建对象时设置的属性以及它的对象类型:

对于邮箱(objectClass = user),如果设置了proxyAddress,mail或textEncodedOrAccess,则交换将不会设置任何值,如果没有设置,则交换将设置所有值。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有一种简单的方法可以知道在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中找到的属性名称