从Exchange Given DirectoryEntry获取电子邮件地址
本文关键字:获取 电子邮件地址 DirectoryEntry Given Exchange | 更新日期: 2023-09-27 18:29:01
我正在循环浏览AD环境中的所有用户,并读取他们的电子邮件地址,以便在另一个系统中更新。我正在使用System.DirectoryServices
库。下面的简化示例。我发现mail
属性并不总是正确的,而且经常丢失,即使用户在Exchange中有有效的邮箱设置和功能。因此,问题是,给定一个DirectoryEntry
,除了读取mail
属性之外,还有什么方法可以从Exchange中列出用户的主要电子邮件地址(理想情况下还有任何别名)吗?我看到了一些使用proxyAddresses
属性的示例,但这些示例似乎也不可靠。我正在寻找一个直接来自Exchange的解决方案。没有如果和但是。这是他们的电子邮件地址。
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);
}
Exchange对此数据没有单独的数据存储。它存储在AD中。如果您通过Exchange API(EWS或PowerShell)收集数据,则最终会得到相同的数据。proxyAddresses
属性是在AD中查找的位置。
根据此
它取决于创建对象时设置的属性以及它是什么类型的对象:
对于邮箱(objectClass=user),如果设置了proxyAddress、mail或textEncodedOrAccess中的任何一个,exchange将不设置任何值,如果未设置值,则exchange会设置所有值。
对于启用邮件的对象(objectClass=user&objectClass=contact),targetAddress是必需的,其他三个对象也适用相同的规则。
Exchange保存电子邮件和别名。循环浏览AD并使用Microsoft.Exchange.WebServices.dll查找Exchange中的用户。然后使用他们的电子邮件地址和别名:)
有一种简单的方法可以知道active directory属性的AD中使用了哪个属性虽然这是一项有点手工的工作,但在浏览了一些样本后,你会知道用于保存电子邮件值的所有属性
下面,您可以循环某些用户的属性名称,并尝试注意哪个属性包含电子邮件值在与不同的用户进行多次尝试后,您将能够知道保存电子邮件并用于从整个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中无法直接找到的属性名称