4

I am using the net-ldap gem to search active directory.
I can search for users by using filter:

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

This gives me all the users whose sAMAccountName starts with neil and is not a computer account.

How do I add a filter that only searches enabled accounts?

4

3 回答 3

15

您可以使用 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 位。

ruleOID 的值可以是以下之一:

•1.2.840.113556.1.4.803 - 这是 LDAP_MATCHING_RULE_BIT_AND 规则。仅当属性中的所有位都与值匹配时,匹配规则才为真。此规则类似于按位 AND 运算符。

•1.2.840.113556.1.4.804 - 这是 LDAP_MATCHING_RULE_BIT_OR 规则。如果属性中的任何位与值匹配,则匹配规则为真。此规则类似于按位 OR 运算符。

例如,当您要查询 Active Directory 以查找已禁用的用户类对象时。保存此信息的属性是 userAccountControl 属性。该属性由不同标志的组合组成。用于设置要禁用的对象的标志是 UF_ACCOUNTDISABLE,其值为 0x02(十进制 2)。使用 UF_ACCOUNTDISABLED 位集指定 userAccountControl 的按位比较过滤器将类似于:(UserAccountControl:1.2.840.113556.1.4.803:=2)

于 2013-01-04T08:26:38.073 回答
3

有更好的方法来解决您的问题。

  1. 默认情况下,所有机器帐户名称都以 结尾$,例如svn$@DOMAIN.COM.
  2. 你有美妙的属性sAMAccountType。它会告诉你这是什么类型的帐户。使用 AD 内置的二进制标志语法。
  3. 启用帐户?我已经在这里回答了这个问题
于 2013-01-03T19:49:23.390 回答
3

Daro 关于使用 !(userAccountControl:1.2.840.113556.1.4.803:=2) 的回答是完全正确的,但我无法使用 Net::LDAP::Filter.join 方法使其与 ruby​​ net/ldap 一起使用。

然而,我确实设法用 Net::LDAP::Filter.construct 来实现它,例如

filter = Net::LDAP::Filter.construct("(&(objectClass=User)(memberOf=CN=mygroup,OU=Groups,DC=myplace)(!(userAccountControl:1.2.840.113556.1.4.803:=2 )))")

于 2013-12-17T15:48:28.443 回答