我如何为 AD 构建 LDAP 查询以返回特定安全组中帐户未被禁用的所有用户?
我试过
(&(objectClass=person)(!(userAccountControl=账户禁用)))
但这似乎不起作用。
我正在尝试设置 Google Apps Directory Sync,并希望它同步“Google Apps 用户”安全组中所有帐户未被禁用的用户(或者,如果这些帐户在 AD 中被禁用,则可选择仅在 GA 中暂停这些帐户)。
答案1
有时,一组是/否值通过设置各个位存储在单个值中。您可以使用位掩码检查它们是否已设置。
例如,十进制中的 546 是二进制值 10 0010 0010 - 以十进制表示,是 512、32 和 2 的总和。(所有这些数字都是 2 的幂,这意味着它们在二进制表示中只有一个“1”):这意味着这三个是/否值已设置。
根据用户帐户控制文档这意味着设置了以下值:
NORMAL_ACCOUNT (512)
PASSWD_NOTREQD (32)
ACCOUNTDISABLE (2)
但是,例如,如果您有一个用户没有PASSWD_NOTREQD
设置(因此他们的 userAccountControl 值为 512),或者有一个用户也DONT_EXPIRE_PASSWORD
设置了 (65536)(意味着他们的值为 66082),那么您将无法在查询中找到这些用户。
你需要做的是使用按位与为了仅查询该位的值:
10 0010 0010
00 0000 0010
------------
00 0000 0010
如果该位的值为 1,则设置该位。其他位设置为何值并不重要,因此您实际上是在询问是否userAccountControl & 2 == 2
。
使用 AND 检查位的 LDAP 语法是 1.2.840.113556.1.4.803,因此您可以ACCOUNTDISABLE
使用 (userAccountControl:1.2.840.113556.1.4.803:=2) 查看位是否已设置。在其周围添加 (!(foo)) 可让您获得所有不是已禁用。
答案2
看起来这可行,但它不会选取嵌套的组成员:
(&
(memberOf=CN=GApsUsers,DN=....)
(!(userAccountControl=546))
)
答案3
这有效!
(&(memberOf=CN=Google Apps Users,DC=bbc,DC=pri)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
答案4
接近,但是
(&(objectClass=person)(!(userAccountControl=ACCOUNTDISABLE)))
应该
(&(objectClass=person)(!userAccountControl=ACCOUNTDISABLE))
请注意,我无法从我所在的地方真正测试这一点!