Подтвердить что ты не робот

Как получить адрес электронной почты пользователя из 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;
}

Может ли кто-нибудь увидеть проблему или указать правильное направление?

4b9b3361

Ответ 1

Отказ от ответственности: Этот код не ищет одно точное совпадение, поэтому для domain\j_doe он может вернуть адрес электронной почты domain\j_doe_from_external_department, если такая учетная запись с таким же именем также существует. Если такое поведение нежелательно, либо используйте фильтр samAccountName вместо целого ana, использованного ниже, либо дополнительно отфильтруйте результаты.

Я успешно использовал этот код (где "account" - это имя пользователя для входа без домена (домен\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();

Ответ 2

Вы, ребята, слишком много работаете:

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

Ответ 3

Вы забыли фильтр.

Попробуйте добавить это перед вызовом FindOne:

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

Ответ 4

Вы можете попробовать приведенный ниже метод GetUserEmail. Если вы хотите найти адрес электронной почты для вошедшего в систему пользователя в MVC, вызовите функцию GetUserEmail() с User.Identity.Name.

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

Ответ 5

Кроме того, где вы извлекаете имя пользователя из (сохраненного, пользовательского ввода, текущего идентификатора)? Имя пользователя может легко меняться (быть переименованным) - идентификация входа в систему SID/Windows с другой стороны не изменяется - так что вам лучше будет делать фильтры/поиски по SID, а не samaccountname - если это возможно и/или необходимо по дизайну...

Ответ 6

update: fredrick прибил его...

Якоб прав. Вам нужно отфильтровать поиск. Вы можете делать всевозможные and и or там тоже, если вам нужно, но я думаю, что sAMAccountName достаточно. Возможно, вы захотите запустить ADSI-инструмент (он, как мне кажется, в наборе ресурсов), который позволяет вам ходить по AD, как в реестре. это отлично подходит для просмотра свойств. Затем найдите пользователя, определите, какую поддержку вы хотите (в этом случае почта), а что это primary key - sAMAccountName, но вы также можете фильтровать по типу node.

Я нахожусь на mac, поэтому я не могу проверить его для вас, но каждый node в AD имеет тип, и вы можете добавить его в свой фильтр. Я думаю, это выглядит так:

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

Опять же, проверьте, что - я знаю, что это не type = user, а что-то вроде этого.