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?
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();
Vous travaillez trop dur:
// Look up the current user's email address
string eMail = UserPrincipal.Current.EmailAddress;
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
Vous avez oublié un filtre.
Essayez d'ajouter ceci avant d'appeler FindOne:
search.Filter = String.Format("(sAMAccountName={0})", account);
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. ..
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;
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;
}
}
mise à jour: fredrick l'a cloué ....
Jakob a raison. Vous devez filtrer votre recherche. Vous pouvez faire toutes sortes de and
s et or
s 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.