LDAP: перечисление пользователей подразделения организации - PullRequest
4 голосов
/ 26 июля 2010

Я пытаюсь составить список всех пользователей, находящихся в подразделении организации в домене, используя LDAP (DirectorySearcher class).

Домен, к которому я подключаюсь, не является текущим доменом, и подразделение, на которое я пытаюсь взглянуть, находится на очень глубоком пути, некоторые имена подразделений повторяются в другом месте, например:

MyDomain.LOCAL / MyCompany / Клиенты / Contoso / Финансовый сайт / Финансовые услуги / Пользователи

Я могу перечислить всех пользователей в домене с помощью следующего кода:

// Build the directory entry
var directoryEntry = new DirectoryEntry(_ldapServer, _domain + "\\" +
    _systemUser, _systemPassword);
try
{
    // Bind to the native AdsObject to force authentication of the system user.
    // It will throw an exception if this is an invalid account
    object obj = directoryEntry.NativeObject;
}
catch (Exception ex)
{
    throw new Exception("Error authenticating system user. " + ex.Message, ex);
}

// create a directory searcher for that OU  
DirectorySearcher users = new DirectorySearcher(directoryEntry);

// set the filter to get just the users
users.Filter = "(&(objectClass=user)(objectCategory=Person))";

// add the attributes you want to grab from the search
users.PropertiesToLoad.Add("givenName");
users.PropertiesToLoad.Add("sn");
users.PropertiesToLoad.Add("mail"); 
users.PropertiesToLoad.Add("name"); 

// grab the users and do whatever you need to do with them
var allFound = users.FindAll();
foreach (SearchResult oResult in allFound)
{
    // etc
}

Это работает и захватывает огромный список всех пользователей, которые находятся в корне (домене).
Тем не менее, я хочу получить пользователей под определенным подразделением.

Я пробовал следующую строку:

var directoryEntry = new DirectoryEntry(_ldapServer +
    "/ou=MyCompany/Clients/Contoso/Financial Site/Financial Services/Users",
    _domain + "\\" + _systemUser, _systemPassword);

И я получаю ошибку:

Error authenticating system user. An operations error occurred.

Кто-нибудь знает, как мне быть более точным в DirectorySearcher для OU, в котором я заинтересован?

<ч />

РЕШИТЬ!

Последняя строка пути (для моего примера) должна быть следующей (без разрывов строки):

LDAP://DomainControllerServer/OU=Users,OU=Financial Services,
    OU=Financial Site,OU=Contoso,OU=Clients,OU=MyCompany,
    DC=MyDomain,DC=LOCAL
DomainControllerServer = IP address in my case.
-- FQDN: MyDomain.LOCAL - Period-separated into DC={part} list
 |-- OU: MyCompany
   |-- OU: Clients
     |-- OU: Contoso
       |-- OU: Financial site
         |-- OU: Financial Services
           |-- OU: Users

Не забудьте экранировать недопустимые символы с обратной косой чертой (\), например, любой из следующих: + , \ = /.

Это был кошмар, но, к счастью, теперь это работает.

1 Ответ

3 голосов
/ 28 июля 2010

Путь, который вы указали для OU пользователя, не является допустимым путем LDAP. Путь LDAP создается в противоположном направлении по сравнению с путем файловой системы или сетевого пути, который вы ввели. Ваш путь может выглядеть следующим образом: ou = пользователи, ou = финансовые услуги, ou = финансовый сайт, ou = Contoso, ou = клиенты, dc = MyCompany

Префиксы действительно важны (т. Е. Ou = или dc =), и предоставленный мною путь может быть неправильным, если какой-либо из объектов относится к другому классу.

Я рекомендую, чтобы в цикле исходного образца кода распечатали oResult.Path и скопировали и вставили желаемый путь. Таким образом, не будет ошибок при построении пути LDAP.

...