получить почтовый адрес из ActiveDirectory

18

Я попытался ответить на эти вопросы Вопросы по SO

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;
}

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

    
задан user95440 24.04.2009 в 13:53
источник

6 ответов

30

Я успешно использовал этот код (где «учетная запись» - это имя входа пользователя без домена (домен \ учетная запись):

// 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();
    
ответ дан Fredrik Mörk 24.04.2009 в 14:19
  • yep тоже работал для меня. Да нужен также синтаксис вызова ... Response.Write (result.Properties ["givenName"] [0] .ToString ()); Response.Write ( "<br>"); Response.Write (result.Properties [ "SN"] [0] .ToString ()); Response.Write ( "<br>"); Response.Write (result.Properties [ "почта"] [0] .ToString ()); Response.Write ( "<br>"); Response.Write (FindName ( "gruberj")); –  user95440 24.04.2009 в 16:22
  • Мне пришлось использовать (& (objectCategory = person) (objectClass = user) (anr="+ account +")) "; в качестве первого результата был компьютер, когда я просто использовал objectClass = user –  Matt 21.08.2013 в 10:52
  • Просто скомпоновал этот принцип, который работал в нашем домене: gist.github.com/roufamatic/8442829 –  roufamatic 15.01.2014 в 20:31
  • anr в запросе выше «неоднозначное разрешение имен» и, следовательно, нечеткое совпадение. Если вы хотите, чтобы точное совпадение использовало sAMAccountName вместо anr в коде выше –  Gareth 01.11.2016 в 16:35
2

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

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

search.Filter = String.Format("(sAMAccountName={0})", account);
    
ответ дан Jakob Christensen 24.04.2009 в 14:07
  • Значения должны быть экранированы перед их помещением в строку фильтра (tools.ietf.org/html/rfc4515#section-3 ff.) –  Tomalak 24.04.2009 в 14:18
2

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

    // Look up the current user's email address
    string eMail =  UserPrincipal.Current.EmailAddress;
    
ответ дан SMerrill8 02.08.2017 в 21:14
  • Что такое UserPrincipal? пространство имен и сборка? –  Kiquenet 26.04.2018 в 15:46
1

Вы можете попробовать использовать метод 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
    
ответ дан user2384722 31.05.2018 в 12:36
1

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

    
ответ дан Oskar Duveborn 24.04.2009 в 14:46
0

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

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

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

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

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

    
ответ дан Nic Wise 24.04.2009 в 14:23
  • Это (objectCategory = пользователь) –  Tomalak 24.04.2009 в 14:25
  • objectCategory = person? –  Oskar Duveborn 24.04.2009 в 14:47
  • Оба будут работать (по крайней мере, в Active Directory). –  Tomalak 24.04.2009 в 14:58