2012-03-07 1 views
12

Sto cercando di cercare utenti in AD con Nome e Nome usando .net DirectorySearcher.Come posso cercare gli utenti nella Directory attiva in base a Nome e nome

In fatti posso trovare sulla base di samAccountName facendo questo:

DirectorySearcher searcher1 = new DirectorySearcher(entry); 
searcher1.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(SAMAccountname={0}))",aLogin); 

SearchResult results1; 
results1 = searcher1.FindOne(); 

Ma quando sto cercando di fare questo:

DirectorySearcher searcher1 = new DirectorySearcher(entry); 
searcher1.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(givenname={0})(sn={1})", aName, aSName); 

SearchResultCollection results1; 
results1 = searcher1.FindAll(); 

Non funziona. Il messaggio dice "Filtro non valido" Quindi non posso filtrare basato su givenname e sn ??

Come posso ottenere questo risultato? Grazie per l'aiuto

+0

?? Un voto negativo dopo 1 anno? Perché? – bAN

+1

Trovo questa domanda genericamente utile senza il problema di battitura specifico – PandaWood

risposta

7

Ti manca una parentesi chiusa nel filtro. Prova:

searcher1.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(givenname={0})(sn={1}))", aName, aSName); 
0

In nessun modo questo è un errore ..

ho dimenticato un )

23

Se si sta utilizzando .NET 3.5 o più recente, si potrebbe anche fare uso del PrincipalSearcher e un "query-by-example" principale per fare la tua ricerca:

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the first name (GivenName) of "Bruce" and a last name (Surname) of "Miller" 
UserPrincipal qbeUser = new UserPrincipal(ctx); 
qbeUser.GivenName = "Bruce"; 
qbeUser.Surname = "Miller"; 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

Se non l'hai già - assolutamente leggere l'articolo di MSDN Managing Directory Security Principals in the .NET Framework 3.5 che mostra bene come utilizzare al meglio le nuove funzionalità in System.DirectoryServices.AccountManagement. Oppure vedi lo spazio dei nomi MSDN documentation on the System.DirectoryServices.AccountManagement.

Naturalmente, a seconda delle necessità, si potrebbe voler specificare altre proprietà su quella principale utente "di query-by-example" si crea:

  • DisplayName (tipicamente: nome + spazio + cognome)
  • SAM Account Name - Windows/AD nome dell'account
  • User Principal Name - il vostro "[email protected]" nome dello stile

È possibile spe cificare una delle proprietà su UserPrincipal e utilizzarle come "esempio per query" per il proprio PrincipalSearcher.

+0

Grazie per i consigli. Ho refactored tutto il mio codice – bAN

+0

L'articolo MSDN è stato rimosso sembra – PandaWood

+0

Dove, in questo esempio, è possibile specificare la stringa di connessione AD: nome utente/password ecc.? – PandaWood