使用C#通过员工ID查询用户电子邮件的Active Directory

时间:2018-11-16 19:25:03

标签: c# active-directory directoryservices

是否可以使用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;
}

1 个答案:

答案 0 :(得分:3)

UserPrincipal.FindByIdentity仅适用于通过AD认为具有识别属性的用户来查找用户。这些在IdentityType枚举中列出。员工号不是其中之一。

您是否在广告中使用employeeIdemployeeNumber?它们是不同的属性,尽管它们都是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;
}