2009-07-07 17 views
6

Próbuję uzyskać zapytanie LDAP, aby zebrać wszystkie właściwości, które posiadamy o naszych użytkownikach bez wcześniejszego określenia właściwości, chciałbym wyświetlić to w tabeli, wykorzystując poniższy kod. Działa to, jeśli odkomentuję wyszukiwanie.PropertiesToLoad.Add ("cn"); linii i wyświetli wszystkie inne właściwości, które dodaję w ten sam sposób, ale nie wtedy, gdy wykonuję pełne wyszukiwanie wszystkich właściwości.Active Directory Wyświetl wszystkie właściwości w tabeli

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; 

Problem wydaje się być z

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

Spodziewałem to do pętli wszystkie właściwości, gdy nie PropertiesToLoad zostało określone, ale nie jest ich sposób, aby osiągnąć to, co chcę.

Wiem, że potrzebuję kilku prób odłowów i innych bitów w kodzie, jak na razie, jest to zgrubny szkic.

Odpowiedz

12

Można to zrobić za pomocą DirectoryEntry, ale nie sądzę, że SearchResultCollection ma wszystkie pola.
Spróbuj utworzyć DirectoryEntry dla każdego wyniku wyszukiwania, powinna mieć wszystkie aktywne właściwości katalogu:

DirectoryEntry entry = result.GetDirectoryEntry(); 

Należy również pamiętać, że w aktywnym katalogu każda właściwość może mieć wiele wartości (jak na polu memberOf), więc Będą również musieli je powtórzyć.
Napisałem podobną metodę, ale wybrałem opcję List z kluczami/wartościami (wydawało się, że jest to łatwiejsze do zarządzania niż WCF.) Byłoby optymalne, ale nie mogłem go uruchomić tutaj). Oto jest usuwana z try/catch/używanie

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

Można iterację wszystkich właściwości w ten sposób:

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()); 
    } 
    } 
} 

że to, co trzeba?

+0

dzięki !!!!!!!!! – Sak

1

Natknąłem tego wątku patrząc na, jak to zrobić sam. Zamiast tego znalazłem inny sposób robienia tego i wygląda na to, że działa dobrze.

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

Załadowanie doskonale odnajdzie się w Combobox. Wystarczy, że ktoś inny natknie się na ten wątek.

+0

To może być bardziej pomocne dla mnie, jeśli komentarz dotyczy UserPrincipal do DirectorySearchera lub coś istotnego. Być może nie wiem wystarczająco dużo o tym obiekcie, ale nie widzę prawidłowego typu obiektu i nie mogę tego rozwiązać. – Taersious

+0

Jest to przy użyciu nowszego System.DirectoryServices.AccountManagement. Więc musisz dodać referencję i instrukcję użycia. – Michael

Powiązane problemy