首页 > 解决方案 > LDAP 查询过滤用户的组如 *x*

问题描述

我目前正在使用 Python 和 LDAP 来查询用户的 Active Directory。

我有一个名字列表,名字是First Last。不够具体,无法找到确切的用户。

我想要一个过滤器,它可以找到所有匹配“最后一个,第一个 *”并属于其中包含关键字的任何组的用户。

    _filter = '''(& (objectclass=user)
                    (objectcategory=person)
                    (name={}*) )'''.format(search_string)

我试过添加......

                    (memberOf=CN=*Keyword*,OU=Delegated,OU=Groups,DC=amr,DC=corp,DC=xxxxxx,DC=com)

到我的过滤器,但没有成功。

如果这是 SQL,我会写如下内容:

 Select *  
 From    
    Users 
 Where
    Users.name like 'First, Last%'    
 and Users.memberOf like 'Keyword%'

更新:

在查看加布里埃尔的答案后,我正在运行这个。

def get_idsids(self, search_string):
   _filter = '''(& (objectclass=user)
                   (objectcategory=person)
                   (anr={}) )'''.format(search_string)

    # Search for user. 
    # Will return list of users matching criteria.
    # The results are wrapped up as a list(tuple(dict))) where the dict vals are binary strings or lists of binary strings.
    users = self.con.search_s(ActiveDirUser.BASEDN, ldap.SCOPE_SUBTREE, _filter, ['displayName', 'sAMAccountName', 'memberOf'])

    # This line is ugly... It just converts the results to a list of ids
    # So long as the user has at least one group with 'Keyword' in the name.
    # upper() is used to make the Keyword requriement case insensitive.
    return [user[1]['sAMAccountName'][0].decode() for user in users if 'KEYWORD' in ''.join(map(str, user[1]['memberOf'])).upper()]

我确实想知道,我可以搜索名称中带有“关键字”的组并从中构建过滤器吗?此外,这会更快吗?我认为它会像 AD 一样散列组成员身份。

我会去做一些阅读,但我认为组名是通配符可搜索的?

标签: pythonactive-directoryldap

解决方案


我建议你使用Ambiguous Name Resolution

_filter = '''(& (objectclass=user)
                (objectcategory=person)
                (anr={}) )'''.format(search_string)

阅读该文档以了解它是如何工作的,但如果你给它一个“first last”字符串,它可以找到用户。这是 AD 用户和计算机中的搜索框使用的。

请注意,如果人们的名字相似,您可以获得双打。如果你以我的名字为例:如果你搜索“Gabriel Luci”,并且有其他人的名字是“Gabriel Luciano”,你会找到我们俩。

这个:

(memberOf=CN=*Keyword*,OU=Delegated,OU=Groups,DC=amr,DC=corp,DC=xxxxxx,DC=com)

不起作用,因为您不能在任何属性上使用通配符distinguishedName,例如memberOf.

无论如何,这适用于 Active Directory。其他 LDAP 目录可能允许它。

如果您需要检查用户是否是组的成员,那么您可以告诉您的搜索返回搜索中的memberOf属性(我不知道 phython,但您应该有一种方法告诉它您想要返回哪些属性)。然后,您可以遍历memberOf属性中的组并查找该关键字。


推荐阅读