2013-01-03 2 views
3

Я использую драгоценный камень net-ldap для поиска активного каталога.
я могу найти пользователей с помощью фильтра:Поиск пользователей «Включено» в net-ldap для Ruby

filter = Net::LDAP::Filter.eq("sAMAccountName", "neil*") 
filter2 = ~Net::LDAP::Filter.eq("objectclass", "computer") 

joined_filter = Net::LDAP::Filter.join(filter, filter2) 

ldap.search(:base => treebase, :filter => joined_filter) do |entry| 
    puts entry.sAMAccountName 
end 

Это дает мне все пользователи, чьи SamAccountName начинается с Нилом и не является учетная запись компьютера.

Как добавить фильтр, который работает только с включенными учетными записями?

ответ

13

Вы можете использовать правило ruleOID LDAP_MATCHING_RULE_BIT_AND, чтобы проверить UserAccountControl.

Я использую этот фильтр, чтобы найти пользователей, которые включены:

(&(objectCategory=organizationalPerson)(objectClass=User)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) 

UserAccountControl: 1.2.840.113556.1.4.803 будет Бит 2 набора, если учетная запись отключена.

The value of ruleOID can be one of the following:

• 1.2.840.113556.1.4.803 - Это правило LDAP_MATCHING_RULE_BIT_AND. Правило сопоставления истинно, только если все биты из свойства соответствуют значению. Это правило похоже на побитовый оператор И.

• 1.2.840.113556.1.4.804 - Это правило LDAP_MATCHING_RULE_BIT_OR. Правило сопоставления истинно, если любые биты из свойства соответствуют значению. Это правило похоже на побитовый оператор OR.

Примером может служить запрос Active Directory для объектов класса пользователя, которые отключены. Атрибутом, который содержит эту информацию, является атрибут userAccountControl. Этот атрибут состоит из комбинации разных флагов. Флаг для установки объекта, который вы хотите отключить, - UF_ACCOUNTDISABLE, который имеет значение 0x02 (2 десятичных числа). Сравнение побитового фильтр, который определяет UserAccountControl с установленным битом UF_ACCOUNTDISABLED будет напоминать это: (UserAccountControl: 1.2.840.113556.1.4.803: = 2)

3

Существует лучший способ решить вашу проблему.

  1. По умолчанию все имена учетных записей компьютеров заканчиваются на $, например. [email protected].
  2. У вас прекрасное attfribute sAMAccountType. Он расскажет вам, какой тип учетной записи. Используйте синтаксис двоичного флага AD-builtin.
  3. Включенные счета? Я уже ответил на этот вопрос here.
3

ответа Дар в об использовании (UserAccountControl: 1.2.840.113556.1.4.803 : = 2) является полностью правильным, но я не мог заставить его работать с ruby ​​net/ldap, используя метод Net :: LDAP :: Filter.join.

Я тем не менее удалось реализовать с Net :: LDAP :: Filter.construct, например

фильтр = Net :: LDAP :: Filter.construct ("(& (объектный = Пользователь) (memberOf = CN = mygroup, OU = Groups, DC = myplace) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2))) ")

+0

Спасибо за указание метода Net :: LDAP :: Filter.construct !! Однако обратите внимание, что если вы скопируете свой запрос из строки сохраненного запроса AD, Net :: LDAP любит фильтры NOT (!), Которые будут окружены дополнительным набором скобок, как указано в вашем примере, какой инструмент Microsoft не использует, t использовать. – jlbenc

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