不一致的 LDAP 过滤器结果
Inconsistent LDAP filter results
我正在尝试查明用户是否是特定 AD 组的间接成员。这是通过 Delphi XE5 程序完成的,但为了清楚起见,我已经在 PowerShell 中编写(并测试)了我的示例。
不幸的是,我从我的 LDAP 查询中收到完全不一致的结果:相同的查询有时会正常工作,有时,return用户不是给定组的成员。
这是我正在尝试的(powershell)示例:
get-aduser -LDAPFilter "(memberof:1.2.840.113556.1.4.1941:=CN=egaa_app,OU=Applications,OU=access,OU=groups,OU=xxx,DC=xxx,DC=xxx,DC=xxx)" -SearchBase "CN=usr-sgr,OU=expert1,OU=experts,OU=remoteusers,OU=users,OU=exogit,OU=xxx,DC=xxx,DC=xxx,DC=xxx"
上面的命令应该return用户usr-sgr
反对如果它是AD组的直接或间接成员egaa_app,OU=Applications,OU=access,OU=groups,OU=xxx,DC=xxx,DC=xxx,DC=xxx
然而,当我 运行 它一次时,我得到一个空的结果。如果我在 AD MMC 中打开用户并以某种方式更新它(在我的例子中,我更改了用户的 "primary group" 然后又将其更改回来),相同的查询成功 returns 用户对象。
我也曾尝试使用 "reverse" 查询(检查给定组是否间接包含用户)并且我看到了相同的行为。
所有这些都是在同一登录会话中在成员服务器(Windows 2008 R2,已打补丁)上完成的。
我想我可以给你解释一下。
先小回忆一下LDAP_MATCHING_RULE_IN_CHAIN:
LDAP_MATCHING_RULE_IN_CHAIN是一个匹配规则OID,旨在提供一种查找对象祖先的方法。此类查询的一个示例是旨在检查用户 "user1" 是否是组 "group1" 的成员的查询。您可以将 base 设置为用户 DN (cn=user1, cn=users, dc=x) 并将范围设置为 base,并使用以下查询。
(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)
这里属性memberof
是要在每个组对象的链中搜索的属性。使用 'user & computer active directory' MMC 中的属性编辑器来遵循此属性:
然后更改主组,你会看到新的主组从memberof属性列表中消失,旧的出现在属性中。
结论,LDAP_MATCHING_RULE_IN_CHAIN不支持主组。
无论如何在 PowerSell 中设置范围 -SearchScope
。
顺便说一句,对我来说,测试这种过滤器的最佳工具是LDIFDE.EXE。
ldifde -f c:\temp\test.ldif -d "CN=Jean-Paul Blanc,OU=Interne,OU=Silogix,DC=silogix,DC=local" -r "(memberof:1.2.840.113556.1.4.1941:=CN=bidon,OU=Interne,OU=Silogix,DC=silogix,DC=local)" -p base
我正在尝试查明用户是否是特定 AD 组的间接成员。这是通过 Delphi XE5 程序完成的,但为了清楚起见,我已经在 PowerShell 中编写(并测试)了我的示例。
不幸的是,我从我的 LDAP 查询中收到完全不一致的结果:相同的查询有时会正常工作,有时,return用户不是给定组的成员。
这是我正在尝试的(powershell)示例:
get-aduser -LDAPFilter "(memberof:1.2.840.113556.1.4.1941:=CN=egaa_app,OU=Applications,OU=access,OU=groups,OU=xxx,DC=xxx,DC=xxx,DC=xxx)" -SearchBase "CN=usr-sgr,OU=expert1,OU=experts,OU=remoteusers,OU=users,OU=exogit,OU=xxx,DC=xxx,DC=xxx,DC=xxx"
上面的命令应该return用户usr-sgr
反对如果它是AD组的直接或间接成员egaa_app,OU=Applications,OU=access,OU=groups,OU=xxx,DC=xxx,DC=xxx,DC=xxx
然而,当我 运行 它一次时,我得到一个空的结果。如果我在 AD MMC 中打开用户并以某种方式更新它(在我的例子中,我更改了用户的 "primary group" 然后又将其更改回来),相同的查询成功 returns 用户对象。
我也曾尝试使用 "reverse" 查询(检查给定组是否间接包含用户)并且我看到了相同的行为。
所有这些都是在同一登录会话中在成员服务器(Windows 2008 R2,已打补丁)上完成的。
我想我可以给你解释一下。
先小回忆一下LDAP_MATCHING_RULE_IN_CHAIN:
LDAP_MATCHING_RULE_IN_CHAIN是一个匹配规则OID,旨在提供一种查找对象祖先的方法。此类查询的一个示例是旨在检查用户 "user1" 是否是组 "group1" 的成员的查询。您可以将 base 设置为用户 DN (cn=user1, cn=users, dc=x) 并将范围设置为 base,并使用以下查询。
(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)
这里属性memberof
是要在每个组对象的链中搜索的属性。使用 'user & computer active directory' MMC 中的属性编辑器来遵循此属性:
然后更改主组,你会看到新的主组从memberof属性列表中消失,旧的出现在属性中。
结论,LDAP_MATCHING_RULE_IN_CHAIN不支持主组。
无论如何在 PowerSell 中设置范围 -SearchScope
。
顺便说一句,对我来说,测试这种过滤器的最佳工具是LDIFDE.EXE。
ldifde -f c:\temp\test.ldif -d "CN=Jean-Paul Blanc,OU=Interne,OU=Silogix,DC=silogix,DC=local" -r "(memberof:1.2.840.113556.1.4.1941:=CN=bidon,OU=Interne,OU=Silogix,DC=silogix,DC=local)" -p base