是否可以使用employeenumber作为查询词从Active Directory中获取用户的电子邮件?
我正在使用C#的System.DirectoryServices
,并且有点迷路了。我公司的前一位开发人员正在使用此过程,但是他有一封电子邮件,正在查询员工编号。我已经将其更改为我认为应该的样子,但是老实说,我不太了解代码。
我的代码有问题吗?每次运行它时,在DirectoryEntry up_user =
行上都会出现Null Reference错误。我想是因为上一行没有得到任何实体。
此外,关于此主题是否有任何好的文档?我到处看的帖子都是2011年或2013年的。
我有以下内容:
try
{
string email = string.Empty;
ContextType authenticationType = ContextType.Domain;
PrincipalContext principalContext = new PrincipalContext(authenticationType, "MATRIC");
UserPrincipal userPrincipal = null;
userPrincipal = UserPrincipal.FindByIdentity(principalContext, empnum);
DirectoryEntry up_User = (DirectoryEntry)userPrincipal.GetUnderlyingObject();
DirectorySearcher deSearch = new DirectorySearcher(up_User);
SearchResultCollection results = deSearch.FindAll();
if (results != null && results.Count > 0)
{
ResultPropertyCollection rpc = results[0].Properties;
foreach (string rp in rpc.PropertyNames)
{
if (rp == "mail")
{
email = rpc["mail"][0].ToString();
}
}
if (email != string.Empty)
{
return email;
}
return null;
}
return null;
}
catch (Exception ex)
{
throw ex;
}
答案 0 :(得分:3)
UserPrincipal.FindByIdentity
仅适用于通过AD认为具有识别属性的用户来查找用户。这些在IdentityType
枚举中列出。员工号不是其中之一。
您是否在广告中使用employeeId
或employeeNumber
?它们是不同的属性,尽管它们都是AD中没有特殊含义或限制的字符串。
employeeId
属性在UserPrincipal
类中公开,因此您可以按照the answer here中的说明使用UserPrincipal
进行搜索:
UserPrincipal searchTemplate = new UserPrincipal(principalContext);
searchTemplate.EmployeeID = employeeId;
PrincipalSearcher ps = new PrincipalSearcher(searchTemplate);
UserPrincipal user = (UserPrincipal)ps.FindOne();
然后,您可以使用找到的帐户的EmailAddress
属性(无需使用DirectorySearcher
进行操作)。
var emailAddress user?.EmailAddress;
如果您使用的是employeeNumber
,则需要使用DirectorySearcher
进行查找。像这样:
var search = new DirectorySearcher(new DirectoryEntry("LDAP://yourdomain.com"));
search.Filter = $"(&(ObjectClass=user)(employeeNumber={employeeNumber}))";
search.PropertiesToLoad.Add("mail");
var result = search.FindOne();
string emailAddress = null;
if (result.Properties.Contains("mail")) {
emailAddress = result.Properties["mail"][0].Value as string;
}