如何从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; } 

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

我已成功使用此代码(其中“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(); 

你忘了filter了。

尝试在调用FindOne之前添加此内容:

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

你们工作太辛苦了:

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

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

您可以尝试以下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 

更新 :fredrick钉它……

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

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

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

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