Запрос Active Directory с использованием C # для электронной почты пользователя по идентификатору сотрудника - PullRequest
0 голосов
/ 16 ноября 2018

Можно ли получить электронную почту пользователя из Active Directory, используя номер персонала в качестве условия запроса?

Я использую C # System.DirectoryServices и немного растерялся.Предыдущий разработчик в моей компании использовал этот процесс, но у него было электронное письмо и он запрашивал номер сотрудника.Я изменил его на то, что, по моему мнению, должно быть, но, если честно, я не очень хорошо понимаю код.

Что-то не так с моим кодом?каждый раз, когда я запускаю его, я получаю ошибку Null Reference в строке DirectoryEntry up_user =.Я предполагаю, что это потому, что предыдущая строка не получает никаких сущностей.

Кроме того, есть ли хорошая документация по этой теме?Куда бы я ни посмотрел, посты с 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 голосов
/ 16 ноября 2018

UserPrincipal.FindByIdentity работает только для поиска пользователя по тому, что AD считает идентифицирующим атрибутом.Они перечислены в перечислении IdentityType.Номер сотрудника не один из них.

Используете ли вы employeeId или employeeNumber в AD?Это разные атрибуты, хотя обе они являются просто строками без специального значения или ограничений в AD.

Атрибут employeeId предоставляется в классе UserPrincipal, поэтому его можно искать с помощью 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;
}
...