2009-04-24 10 views
17

ho cercato le risposte a queste domande Questions on SOottenere l'indirizzo di posta da ActiveDirectory

String account = userAccount.Replace(@"Domain\", ""); 
DirectoryEntry entry = new DirectoryEntry(); 

try { 
    DirectorySearcher search = new DirectorySearcher(entry); 

    search.PropertiesToLoad.Add("mail"); // e-mail addressead 

    SearchResult result = search.FindOne(); 
    if (result != null) { 
     return result.Properties["mail"][0].ToString(); 
    } else { 
     return "Unknown User"; 
    } 
} catch (Exception ex) { 
    return ex.Message; 
} 

Chiunque può vedere il problema o punto nella giusta direzione?

risposta

28

Ho usato questo codice con successo (dove "conto" è il nome di accesso utente senza l'account di dominio (domain \):

// get a DirectorySearcher object 
DirectorySearcher search = new DirectorySearcher(entry); 

// specify the search filter 
search.Filter = "(&(objectClass=user)(anr=" + account + "))"; 

// specify which property values to return in the search 
search.PropertiesToLoad.Add("givenName"); // first name 
search.PropertiesToLoad.Add("sn");   // last name 
search.PropertiesToLoad.Add("mail");  // smtp mail address 

// perform the search 
SearchResult result = search.FindOne(); 
+1

.... e quella sarebbe la risposta corretta :) Bello :) –

+2

ha funzionato anche per me. Sì, è necessario anche la sintassi di chiamata ... Response.Write (result.Properties ["givenName"] [0] .ToString()); Response.Write ("
"); Response.Write (result.Properties ["sn"] [0] .ToString()); Response.Write ("
"); Response.Write (result.Properties ["mail"] [0] .ToString()); Response.Write ("
"); Response.Write (FindName ("gruberj")); – user95440

+3

Ho dovuto usare (& (objectCategory = person) (objectClass = user) (anr = "+ account +")) "; Come primo risultato è stato un computer quando ho appena usato objectClass = utente – Matt

2

Hai dimenticato un filtro.

Prova ad aggiungere questo prima di chiamare FindOne:

search.Filter = String.Format("(sAMAccountName={0})", account); 
+0

I valori devono essere fuggiti prima di essere messi nella stringa di filtro (http://tools.ietf.org/html/rfc4515#section-3 ff .) – Tomalak

0

aggiornamento: fredrick inchiodato ....

Jakob ha ragione. È necessario filtrare la ricerca. È possibile effettuare tutti i tipi di and se or s anche lì se è necessario, ma penso che sAMAccountName è sufficiente. Potresti voler attivare lo strumento ADSI (è nel kit delle risorse che penso), che ti permette di camminare su AD come il registro. è fantastico per guardare le proprietà. Quindi trova un utente, calcola che cosa vuoi (mail in questo caso) e cosa è primary key è - sAMAccountName è un buon, ma potresti anche voler filtrare sul tipo di nodo.

Sono su un Mac, quindi non posso verificarlo, ma ogni nodo in AD ha un tipo e puoi aggiungerlo al tuo filtro. Credo che assomiglia a questo:

((sAMAccountName=bob) & (type=User)) 

Anche in questo caso, verificare che - lo so che non è il tipo = user, ma qualcosa di simile.

+0

It's (objectCategory = user) – Tomalak

+0

objectCategory = person? –

+0

Entrambi funzioneranno (in Active Directory almeno). – Tomalak

0

Inoltre, da dove viene estratto il nome utente (memorizzato, input dell'utente, identità corrente)? Un nome utente può cambiare (può essere rinominato) facilmente - l'identità di accesso SID/Windows, d'altra parte, non cambia - quindi sarebbe meglio fare filtri/ricerche da SID piuttosto che samaccountname - se possibile e/o necessario per il design. ..

2

Voi ragazzi stanno lavorando troppo duro:

// Look up the current user's email address 
    string eMail = UserPrincipal.Current.EmailAddress; 
Problemi correlati