2009-07-07 18 views
6

Sto cercando di raggiungere una query LDAP per raccogliere tutte le proprietà che abbiamo sui nostri utenti senza specificare le proprietà prima mano, vorrei mostrarlo in una tabella in modo da utilizzare il codice sottostante. Funziona se rimetto il commento alla ricerca.PropertiesToLoad.Add ("cn"); linea e mostrerà tutte le altre proprietà che aggiungo nello stesso modo ma non quando eseguo una ricerca completa di tutte le proprietà.Active Directory Visualizza tutte le proprietà in una tabella

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; 

Il problema sembra essere con

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

mi aspettavo questo a ciclo tutte le proprietà quando era stata specificata alcuna PropertiesToLoad ma non è il loro modo per ottenere ciò che voglio.

So che ho bisogno di alcuni tentativi di cattura e altri bit nel codice fino ad ora, è un progetto preliminare.

risposta

12

Questo può essere fatto utilizzando DirectoryEntry, ma non penso che lo SearchResultCollection abbia tutti i campi.
cercare di creare una DirectoryEntry per ogni risultato di ricerca, dovrebbe avere tutte le proprietà di Active Directory:

DirectoryEntry entry = result.GetDirectoryEntry(); 

Si noti inoltre che nella directory attiva ogni proprietà può avere più valori (come il campo MemberOf), in modo da Dovrò anche iterarli.
Ho scritto un metodo simile, ma ho scelto un List con chiavi/valori (sembrava più gestibile su WCF. ILookup sarebbe ottimale, ma non riuscivo a farlo funzionare qui). Qui è, spogliato da try/catch/usando

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

È possibile scorrere tutte le proprietà in questo modo:

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 'questo quello che ti serve?

+0

grazie !!!!!!!!! – Sak

1

sono imbattuto in questo thread mentre guardando su come fare questo io stesso. Invece ho trovato un modo diverso di farlo, e sembra che stia funzionando bene.

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

Il caricamento si trova perfettamente in una casella combinata. Basta incolpare chiunque altro incontri questo thread.

+0

Questo potrebbe essere più utile per me se il tuo commento riguardasse un UserPrincipal a un DirectorySearcher, o qualcosa di rilevante. Potrei non sapere abbastanza su questo oggetto, ma non vedo alcun tipo di oggetto valido, e non posso risolverlo. – Taersious

+0

Questo sta utilizzando il più recente System.DirectoryServices.AccountManagement. Quindi dovresti aggiungere un riferimento e usare una dichiarazione. – Michael

Problemi correlati