2009-04-24 3 views
17

J'ai essayé les réponses à ces questions Questions on SOobtenir l'adresse mail de 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; 
} 

Quelqu'un peut-il voir la question ou d'un point dans la bonne direction?

Répondre

28

J'ai utilisé ce code avec succès (où "compte" est le nom d'ouverture de session utilisateur sans le domaine (domaine \ compte):

// 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

.... et ce serait la bonne réponse :) Nice :) –

+2

yep a travaillé pour moi aussi. Oui, la syntaxe d'appel est également nécessaire ... 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

Je devais utiliser (& (objectCategory = personne) (objectClass = user) (anr = "+ compte +")) "; Comme le premier résultat était un ordinateur lorsque je viens d'utiliser objectClass = user – Matt

2

Vous avez oublié un filtre.

Essayez d'ajouter ceci avant d'appeler FindOne:

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

les valeurs doivent être échappés avant d'être mis dans la chaîne de filtre (http://tools.ietf.org/html/rfc4515#section-3 ff .) – Tomalak

0

mise à jour: fredrick cloué ....

Jakob a raison, vous devez filtrer vos résultats .. and s et or s là aussi si vous avez besoin, mais je pense que sAMAccountName est suffisant. Vous pourriez vouloir lancer l'outil ADSI (il est dans le kit de ressources je pense), ce qui vous permet de marcher AD comme le registre. C'est super pour regarder les propriétés. Ensuite, trouver un utilisateur, entraînez ce que vous voulez soutenir (courrier dans ce cas) et ce qu'il est primary key - sAMAccountName est un bon, mais vous pouvez également filtrer sur le type de noeud.

Je suis sur un Mac, donc je ne peux pas le vérifier pour vous, mais chaque nœud AD a un type, et vous pouvez ajouter à votre filtre. Je pense qu'il ressemble à ceci:

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

Encore une fois, vérifiez que - je sais qu'il est pas de type = utilisateur, mais quelque chose comme ça.

+0

C'est (objectCategory = user) – Tomalak

+0

objectCategory = personne? –

+0

Les deux fonctionneront (dans Active Directory au moins). – Tomalak

0

également, où vous tirez le nom d'utilisateur (stocké, entrée de l'utilisateur, l'identité actuelle)? Un nom d'utilisateur peut changer (renommer) facilement - le SID/ouverture de session Windows Identity d'autre part ne change pas - donc vous serait mieux de faire des filtres/recherches par SID plutôt que samaccountname - si possible et/ou nécessaire du design. ..

2

Vous les gars travaillent trop dur:

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