2014-11-04 230 views
0

我正在浏览AD环境中的所有用户,并阅读他们的电子邮件地址,以便在另一个系统中更新它。我正在使用System.DirectoryServices库。下面的简单例子。我发现的是,mail属性并不总是正确的,即使用户在Exchange中有一个有效的邮箱设置和功能,通常也会丢失。所以,问题是,给定一个DirectoryEntry,除了阅读mail属性之外,是否有任何方法可以列出来自Exchange的用户的主要电子邮件地址(以及理想的任何别名)?我见过一些examples that use the proxyAddresses attribute,但这些似乎也不可靠。我正在寻找直接来自Exchange的解决方案。没有关于它的事情。这是他们的电子邮件地址。从给定的电子邮件地址获取电子邮件地址DirectoryEntry

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); 
} 
+0

你对'PrincipalContext'熟悉吗?你也可以通过这个域名的电子邮件地址获得这些信息。也可以通过代码改变这行'entry.Properties [“mail”]。Value'到以下'entry.Properties [“mail”]。Value.ToString();' – MethodMan 2014-11-04 20:32:28

+0

@DJKRAZE只读取'mail'属性。 – 2014-11-04 20:34:51

+0

您是否曾尝试使用PrincipalContext获取所有用户的列表,或者至少尝试使用您的用户名,这将是您在网络中使用的SamAccount名称..您将看到它将返回电子邮件地址外观提供有关如何使用PrincipalContext获取所有AD用户的示例 – MethodMan 2014-11-04 20:37:54

回答

1

交易所直接发现没有此数据的单独的数据存储。它存储在AD中。如果您通过Exchange API(EWS或PowerShell)收集数据,则最终会获得相同的数据。 proxyAddresses属性是在AD中查找的地方。

0

根据this

这取决于在创建对象时什么属性被设置和对象的类型,它是:

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

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

+0

我们的环境中几乎没有用户对象具有'targetAddress'属性集。 – 2014-11-04 20:31:24

0

Exchange保存电子邮件和别名。 循环访问您的AD并使用Microsoft.Exchange.WebServices.dll来查找交换中的用户。然后你会与他们的电子邮件地址和别名:)

0

有一个简单的方法来知道哪些属性在AD使用Active Directory属性 虽然这是一个有点手工作业做,但以后喜欢什么通过一些示例,您将了解下面用于保存电子邮件值

的所有属性,您可以遍历某些用户的属性名称,并尝试注意哪些属性在多次尝试后保留电子邮件值 与不同的用户,你将能够知道持有电子邮件并用于从整个公元获得电子邮件的不同属性名称

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

+0

谢谢,但这没有帮助。这仍然是从LDAP读取属性,正如我试图表达的不准确。我需要直接与Exchange服务器通信的东西。 – 2014-11-06 18:20:51