我正在遍历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);
}
答案 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中找到的属性名称