如何从Active Directory获取用户的电子邮件地址?

时间:2009-04-24 11:53:24

标签: c# active-directory

我试图在AD中获取用户的电子邮件地址但没有成功。

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;
}

任何人都可以看到问题或指向正确的方向吗?

8 个答案:

答案 0 :(得分:38)

我已成功使用此代码(其中“account”是没有域(domain \ account)的用户登录名:

// 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 :(得分:10)

你们工作太辛苦了:

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

答案 2 :(得分:2)

你忘记了一个过滤器。

在调用FindOne之前尝试添加它:

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

答案 3 :(得分:2)

您可以尝试以下GetUserEmail方法。如果您希望在MVC中找到登录用户的电子邮件地址,请使用 User.Identity.Name

调用 GetUserEmail()功能
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

答案 4 :(得分:1)

此外,您从哪里提取用户名(存储,用户输入,当前身份)?用户名可以轻松更改(重命名) - 另一方面,SID / Windows登录标识不会更改 - 因此您最好通过SID而不是samaccountname进行过滤/搜索 - 如果可能和/或需要设计。 ..

答案 5 :(得分:1)

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;
   }
}

答案 6 :(得分:0)

更新:fredrick钉了它......

雅各布是对的。您需要过滤搜索。如果需要,您也可以在那里执行各种andor,但我认为sAMAccountName就足够了。您可能想要启动ADSI工具(我认为它位于资源工具包中),它可以让您像注册表一样走AD。它非常适合查看房产。然后找一个用户,找出你想要的道具(在这种情况下是邮件)以及它是primary key是什么 - sAMAccountName是一个好的,但你可能还想过滤节点类型。

我在Mac上,所以我无法为您检查,但AD中的每个节点都有一个类型,您可以将其添加到过滤器中。我认为它看起来像这样:

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

再次,检查一下 - 我知道它不是type = user,而是类似的东西。

答案 7 :(得分:-1)

您需要为System.DirectoryServices.AccountManagement添加引用,并在using语句中包括相同的引用。现在,您将可以访问当前用户的登录详细信息,如下所列,包括电子邮件地址。

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