2009-07-07 65 views
6

我想實現一個LDAP查詢來收集我們擁有的有關用戶的所有屬性,而無需事先指定屬性,我想在表中顯示這樣使用下面的代碼。如果我取消註釋search.PropertiesToLoad.Add(「cn」);行,並會以相同的方式顯示我添加的任何其他屬性,但不會在我完全搜索所有屬性時顯示。活動目錄顯示錶中的所有屬性

DirectoryEntry myLdapConnection = createDirectoryEntry(); 
DirectorySearcher search = new DirectorySearcher(myLdapConnection); 

search.CacheResults = true; 
//search.PropertiesToLoad.Add("cn"); 

SearchResultCollection allResults = search.FindAll(); 
DataTable resultsTable = new DataTable("Results"); 

//add columns for each property in results 
foreach (string colName in allResults.PropertiesLoaded) 
    resultsTable.Columns.Add(colName, colName.GetType()); 

//loop to add records to DataTable 
foreach (SearchResult result in allResults) 
{ 
    int tmp = result.Properties.Count; 
    DataRow row = resultsTable.NewRow(); 
    foreach (string columnName in search.PropertiesToLoad) 
    { 
     if (columnName.Equals("lastlogon")) 
     { 
      if (result.Properties.Contains(columnName)) 
       row[columnName] = ConvertDate(result.Properties[columnName].ToString()); 
      else 
       row[columnName] = ""; 
     } 
     else 
     { 
      if (result.Properties.Contains(columnName)) 
       row[columnName] = result.Properties[columnName][0].ToString(); 
      else 
       row[columnName] = ""; 
     } 
    } 
    resultsTable.Rows.Add(row); 
} 

gridResults.DataSource = resultsTable; 

這個問題似乎是與

foreach (string colName in allResults.PropertiesLoaded) 
    resultsTable.Columns.Add(colName, colName.GetType()); 

我想到這循環中的所有屬性時,沒有指定PropertiesToLoad了,但它不會是他們的方式來實現我想要的。

我知道我需要一些嘗試漁獲物和其他位代碼作爲然而,這是一個粗略的草稿。

回答

12

這可以通過使用DirectoryEntry做,但我不認爲SearchResultCollection有各個領域。
嘗試創建爲每個搜索結果的DirectoryEntry,它應該有所有的Active Directory特性:

DirectoryEntry entry = result.GetDirectoryEntry(); 

另外,還要注意的是,在活動目錄中的每個屬性可以有多個值(如成員字段),所以你也必須迭代它們。
我已經寫了一個類似的方法,但是我選擇了與鍵/值的List(它似乎在WCF更易於管理。ILookup將是最佳的,但我無法得到它在這裏工作)。在這裏它是,從嘗試/捕獲/使用剝離

var list = new List<KeyValuePair<string, string>>(); 
foreach (PropertyValueCollection property in entry.Properties) 
    foreach (object o in property) 
    { 
     string value = o.ToString(); 
     list.Add(new KeyValuePair<string, string>(property.PropertyName, value)); 
    } 
10

您可以通過所有屬性重複這樣:

foreach (SearchResult searchResult in allResults) 
{ 
    foreach (string propName in searchResult.Properties.PropertyNames) 
    { 
    ResultPropertyValueCollection valueCollection = 
    searchResult.Properties[propName]; 
    foreach (Object propertyValue in valueCollection) 
    { 
    Console.WriteLine("Property: " + propName + ": " + propertyValue.ToString()); 
    } 
    } 
} 

是你需要什麼?

+0

感謝!!!!!!!!! – Sak 2017-04-17 08:57:09

1

來到這個線程,一邊看自己如何做到這一點。 相反,我發現了一種不同的方式,並且似乎工作正常。

return ((DirectoryEntry)UserPrincipal.Current.GetUnderlyingObject()).Properties.PropertyNames; 

無論如何,它的加載完全可以在Combobox中找到。 只要介紹任何人遇到此線程。

+0

如果您的評論將UserPrincipal與DirectorySearcher相關聯或相關,這可能對我更有幫助。我可能對這個對象不夠了解,但是我看不到有效的對象類型,而且我無法解決這個問題。 – Taersious 2015-08-11 14:20:59