在net-ldap中搜索Ruby的“已启用”用户

我正在使用net-ldap gem来搜索活动目录。
我可以使用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 

这给了我所有sAMAccountName以neil开头并且不是计算机帐户的用户。

如何添加仅搜索已启用帐户的filter?

您可以使用ruleOID LDAP_MATCHING_RULE_BIT_AND规则来检查UserAccountControl。

我使用此filter来查找已启用的用户:

 (&(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规则。 如果属性中的任何位与值匹配,则匹配规则为true。 此规则类似于按位OR运算符。

例如,您希望在Active Directory中查询已禁用的用户类对象。 保存此信息的属性是userAccountControl属性。 该属性由不同标志的组合组成。 用于设置要禁用的对象的标志是UF_ACCOUNTDISABLE,其值为0x02(十进制2)。 指定userAccountControl并且设置了UF_ACCOUNTDISABLED位的按位比较filter将类似于:(UserAccountControl:1.2.840.113556.1.4.803:= 2)

有一种更好的方法可以解决您的问题。

  1. 默认情况下,所有计算机帐户名都以$结尾,例如svn$@DOMAIN.COM
  2. 你有很棒的attAMAMAccountType。 它会告诉你什么类型的帐户。 使用AD内置二进制标志语法。
  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) )))“)