web-dev-qa-db-fra.com

Comment obtenir l'adresse e-mail d'un utilisateur depuis Active Directory?

J'essaie d'obtenir l'adresse e-mail d'un utilisateur dans AD sans succès.

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 le problème ou pointer dans la bonne direction?

23
user95440

Clause de non-responsabilité: Ce code ne recherche pas correspondance exacte unique , donc pour domain\j_doe Il peut renvoyer L'adresse e-mail de domain\j_doe_from_external_department Si un compte portant le même nom existe également. Si un tel comportement n'est pas souhaitable, utilisez soit un filtre samAccountName à la place d'un anr celui utilisé ci-dessous, soit filtrez également results .

J'ai utilisé ce code avec succès (où "compte" est le nom de connexion de l'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();
44
Fredrik Mörk

Vous travaillez trop dur:

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

Vous pouvez essayer la méthode GetUserEmail ci-dessous. Si vous cherchez à trouver l'adresse e-mail de l'utilisateur connecté dans MVC, appelez la fonction GetUserEmail () avec ser.Identity.Name

using System.DirectoryServices;
using System.Linq;

public string GetUserEmail(string UserId)
    {

        var searcher = new DirectorySearcher("LDAP://" + UserId.Split('\\').First().ToLower())
        {
            Filter = "(&(ObjectClass=person)(sAMAccountName=" + UserId.Split('\\').Last().ToLower() + "))"
        };

        var result = searcher.FindOne();
        if (result == null)
            return string.Empty;

        return result.Properties["mail"][0].ToString();

    }

GetUserEmail(User.Identity.Name) //Get Logged in user email address
3
Kaarthikeyan

Vous avez oublié un filtre.

Essayez d'ajouter ceci avant d'appeler FindOne:

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

De plus, d'où tirez-vous le nom d'utilisateur (stocké, entrée utilisateur, identité actuelle)? Un nom d'utilisateur peut changer (être renommé) facilement - l'identité de connexion SID/Windows d'autre part ne change pas - il vaut donc mieux faire des filtres/recherches par SID plutôt que samaccountname - si possible et/ou nécessaire en termes de conception. ..

1
Oskar Duveborn

Vous devez ajouter des références pour System.DirectoryServices.AccountManagement et inclure ces mêmes références dans votre instruction using. Maintenant, vous aurez accès aux informations de connexion des utilisateurs actuels comme indiqué ci-dessous, y compris l'adresse e-mail.

string loginname = Environment.UserName;
string firstname = UserPrincipal.Current.GivenName;
string lastname = UserPrincipal.Current.Surname;
string name = UserPrincipal.Current.Name;
string eMail = UserPrincipal.Current.EmailAddress;
0
A. Lartey

Et ça

public string GetEmailFromSamAccountName(string samAccountName, string domain="YOURCOMPANY")
{
   using (var principalContext = new PrincipalContext(ContextType.Domain, domain))
   {
      var userPrincipal = UserPrincipal.FindByIdentity(principalContext, samAccountName);
      return userPrincipal.EmailAddress;
   }
}
0
Muflix

mise à jour: fredrick l'a cloué ....

Jakob a raison. Vous devez filtrer votre recherche. Vous pouvez faire toutes sortes de ands et ors là aussi si vous en avez besoin, mais je pense que sAMAccountName est suffisant. Vous voudrez peut-être lancer l'outil ADSI (il est dans le kit de ressources, je pense), qui vous permet de parcourir AD comme le registre. c'est super pour regarder les propriétés. Ensuite, trouvez un utilisateur, déterminez quel accessoire vous voulez (mail dans ce cas) et ce que c'est primary key est - sAMAccountName est une bonne option, mais vous pouvez également filtrer le type de nœud.

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

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

Encore une fois, vérifiez que - je sais que ce n'est pas type = user, mais quelque chose comme ça.

0
Nic Wise