我试图在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;
}
任何人都可以看到问题或指向正确的方向吗?
答案 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钉了它......
雅各布是对的。您需要过滤搜索。如果需要,您也可以在那里执行各种and
和or
,但我认为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;