Поиск пользователя в Active Directory с именем пользователя - PullRequest
7 голосов
/ 02 октября 2008

Возможно, я просто глуп, но я пытаюсь найти пользователя в Active Directory из C #, используя имя для входа ("домен \ пользователь").

Моя функция поиска "Skeleton" AD обычно выглядит так:

de = new DirectoryEntry(string.Format("LDAP://{0}", ADSearchBase), null, null, AuthenticationTypes.Secure);
ds = new DirectorySearcher(de);
ds.SearchScope = SearchScope.Subtree;
ds.PropertiesToLoad.Add("directReports");
ds.PageSize = 10;
ds.ServerPageTimeLimit = TimeSpan.FromSeconds(2);
SearchResult sr = ds.FindOne();

Теперь это работает, если у меня есть полное DN пользователя (ADSearchBase обычно указывает на подразделение «Наши пользователи» в Active Directory), но я просто не знаю, как искать пользователя на основе «домена \» пользовательский "синтаксис.

Есть указатели?

Ответы [ 3 ]

9 голосов
/ 02 октября 2008

Вам нужно установить фильтр (DirectorySearcher.Filter) примерно так:

"(& (ObjectCategory = человек) (объектный = пользователь) (SamAccountName = {0}))"

Обратите внимание, что вы указываете только имя пользователя (без домена) для свойства sAMAccountName. Чтобы найти домен \ пользователь, сначала найдите контекст именования для нужного домена, а затем найдите sAMAccountName.

Кстати, при построении строк запроса LDAP с использованием String.Format, как правило, следует избегать использования любых специальных символов. Вероятно, это не обязательно для имени учетной записи, но может быть, если вы ищете по другим свойствам, таким как имя пользователя (свойство GivenName) или фамилия (свойство sn). У меня есть служебный метод EscapeFilterLiteral для этого: вы строите свою строку следующим образом:

String.Format("(&(objectCategory=person)(objectClass=user)(sn={0}))", 
              EscapeFilterLiteral(lastName, false)); 

где EscapeFilterLiteral реализован следующим образом:

public static string EscapeFilterLiteral(string literal, bool escapeWildcards)
{
    if (literal == null) throw new ArgumentNullException("literal");

    literal = literal.Replace("\\", "\\5c");
    literal = literal.Replace("(", "\\28");
    literal = literal.Replace(")", "\\29");
    literal = literal.Replace("\0", "\\00");
    literal = literal.Replace("/", "\\2f");
    if (escapeWildcards) literal = literal.Replace("*", "\\2a");
    return literal;
}

Эта реализация позволяет вам трактовать символ * как часть литерала (escapeWildcard = true) или как символ подстановки (escapeWildcard = false).

ОБНОВЛЕНИЕ: Это не имеет никакого отношения к вашему вопросу, но приведенный вами пример не вызывает утилизации для одноразовых объектов, которые он использует. Как и все одноразовые объекты, эти объекты (DirectoryEntry, DirectorySearcher, SearchResultCollection) всегда должны быть расположены, обычно с помощью оператора using. См. этот пост для получения дополнительной информации.

0 голосов
/ 13 августа 2013

Имя для входа (до Windows 2000)

"(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(sAMAccountName=John))"

Имя для входа (Windows 2000 и выше)

"(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(userPrincipalName=John))"
0 голосов
/ 02 октября 2008

Спасибо. Я решил, что могу получить домен (по крайней мере, в моей AD), указав «LDAP: // {0} .somedomain.com / DC = {0}, DC = somedomain, DC = com», заменив {0} на домен, который работает в нашей среде как минимум.

Хотя один вопрос: sAMAccountName кажется устаревшим: Имя входа, используемое для поддержки клиентов и серверов, работающих под управлением более старых версий операционной системы, таких как Windows NT 4.0, Windows 95, Windows 98 и LAN Manager. Этот атрибут должен содержать не более 20 символов для поддержки старых клиентов.

Это все еще лучший подход к этому? Или есть более «современное» поле для запроса? (Windows 2003 Active Directory, клиенты Windows XP или 2003, .net 3.0)

Редактировать: Еще раз спасибо. Наша структура немного сложна: у нас большой лес "domain.com" с несколькими доменами для региональных офисов. По сути: Логин - это «что-то \ имя пользователя», полный домен - что-то .domain.com, а почта - user@domain.com (без чего-то), но основное имя - user@something.domain.com. Я вручную "переведу" что-то \ username на username@something.domain.com, так как это кажется наиболее надежным способом. Тем более, что я хочу сохранить функцию автообнаружения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...