2014-11-04 229 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