2013-07-05 4 views
1

Я использую следующий запрос в AD, чтобы вернуть почты пользователя:LDAP запрос для пользователя в AD, приводят компьютерный объект

// get a DirectorySearcher object 
     DirectorySearcher search = new DirectorySearcher(); 

     // specify the search filter 
     search.Filter = "(&(objectClass=user)(anr=" + login + "))"; 

     // specify which property values to return in the search 
     search.PropertiesToLoad.Add("mail");  // smtp mail address 

     // perform the search 
     SearchResult result = search.FindOne(); 

     if (result != null) 
     { 

      return result.Properties["mail"][0].ToString(); 
     } 
     else 
     { 

      return null; 
     } 

Для конкретного пользователя, который Логин пользователя является «SRB» запрос возвращает компьютерный объект под названием «SRB-PC».

Я не понимаю, почему, поскольку фильтр говорит, что objectClass должен быть «пользователем».

Также - почему он возвращает его как бы «как» запрос - я хочу, чтобы он возвращал только объекты, чье имя точно соответствует фильтру.

ответ

2

A Computer объект является вспомогательным Класс объекта User в Active Directory. Именно по этой причине вы находите компьютеры для своего первоначального поиска.

objectCategory элемент используется, чтобы различать объекты правильно: -

, как указано в Object Class vs. Object Category странице:

До Windows Server 2008, атрибут Objectclass не индексируется. Это связано с тем, что оно имеет несколько значений и крайне неуникально; то есть каждый экземпляр атрибута objectClass включает верхний класс. Это означает, что индекс будет очень большим и неэффективным. Чтобы найти объекты данного класса, используйте атрибут objectCategory, который является однозначным и индексированным. Дополнительные сведения об использовании этих свойств в фильтрах поиска см. В разделе «Решение о том, что нужно найти».

Так что гораздо эффективнее выполнять поиск с использованием objectCategory вместо objectClass.

1

OK - переключил фильтр:

search.Filter = string.Format("(&(objectCategory=Person)(anr={0}))", login); 

Не понимаю, почему он установил его, но это было!

1

Вы хорошо использовать что-то вроде:

(&(objectCategory=person)(objectClass=user)) 
or 
    (sAMAccountType=805306368) 

Смотрите некоторые other MS queries.

Смежные вопросы