如何过滤LDAP查询以获取包含特定用户的组?

10

如何在Active Directory中过滤LDAP查询以包含已认证/绑定用户(或任何用户)的组?以下代码可正常工作:

(&(objectClass=group)(member=*))
>>> lots of results

但我不能再深入细节了:

(&(objectClass=group)(member=*S*))
>>> nothing

MSDN提到可以使用这样的筛选器:

(member:1.2.840.113556.1.4.1941:=(cn=user1,cn=users,DC=x))

但是即使忽略其中的奇怪超级魔术数字,当我尝试使用它进行过滤时,我总是得到0个结果(即使将cn=user1,cn=users,DC=x替换为我的专有名称,甚至替换为*)。


下面@JPBlanc的答案中链接的MSDN搜索过滤器语法页面列出了疯狂的超级魔术数字,但它并没有解释它。 解释是它是ISO和ITU-T管理的晦涩的全球[OID](https://en.wikipedia.org/wiki/Object_identifier)标准中的一个节点,其中LDAP是[少数知名用途之一](https://en.wikipedia.org/wiki/Object_identifier#Usage)。请参见http://www.oid-info.com/cgi-bin/display?tree=1.2.840.113556.1.4.1941以了解每个数字重要性的结构分解。 - Stuart P. Bentley
2个回答

11
您需要完整的用户DN,即
(&(member=CN=Your Name,OU=Your OU,DC=company,DC=com)(objectClass=group))

请注意,在此处不能使用 * 符号。


4
当我尝试使用该筛选条件进行过滤时,即使使用自己的distinguishedName替换"cn=user1,cn=users,DC=x",我总是无法得到任何结果。 - Stuart P. Bentley

5

所以,在递归搜索中涉及的 crazy hyper magic numberSearch Filter Syntax 中有解释。

为了在一次搜索(递归地)找到“user1”是成员的所有组:

  • 将基础设置为组容器DN;例如根DN(dc = dom,dc = fr)
  • 将范围设置为子树
  • 使用以下过滤器:(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

使用 Windows Server 中包含的命令行工具 LDIFDE.EXE 明确说明如下:

ldifde -f user1Grps.ldf -d "dc=societe,dc=local" -r "(member:1.2.840.113556.1.4.1941:=cn=user1,ou=Monou,dc=societe,dc=local)"

如果您正在运行此操作在W2K8或W2K8 R2服务器上,请小心以管理员身份运行。

如果您在使用C#编程,您可以使用以下代码:

/* Retreiving a principal context
 */
Console.WriteLine("Retreiving a principal context");
PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "PWD");


/* Look for all the groups a user belongs to
 */
UserPrincipal aUser = UserPrincipal.FindByIdentity(domainContext, "user1");
PrincipalSearchResult<Principal> a =  aUser.GetAuthorizationGroups();

foreach (GroupPrincipal gTmp in a)
{
  Console.WriteLine(gTmp.Name);    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接