【问题标题】:LDAP Query Filter User's with Groups Like *x*LDAP 查询过滤用户的组如 *x*
【发布时间】:2018-12-13 22:23:22
【问题描述】:

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

我有一个名列前茅的名字。不够具体,无法找到确切的用户。

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

    _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 一样散列组成员身份。

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

【问题讨论】:

    标签: python active-directory ldap


    【解决方案1】:

    我建议你使用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 属性中的组并查找该关键字。

    【讨论】:

    • Gabriel,谢谢你的建议(anr),我会用那个。对于查找用户是否是名称中包含“关键字”的组的成员,您有什么建议吗?我刚刚设置让 Python 检查 memberOf 结果中的“关键字”,但它有点慢。
    • 没有办法在一次搜索中完成所有操作。只要您将memberOf 作为搜索结果的一部分,并且不进行其他搜索以获取memberOf 详细信息,浏览memberOf 的速度就不会变慢。如果你愿意,你可以用你的新代码更新你的问题,我可以看看。
    • 当您说“没有办法在一次搜索中完成所有操作。”你的意思是我应该搜索组,然后从中构建过滤器?
    • 您不需要进行第二次搜索,不。我的意思是您不能搜索“具有此名称的用户,这些用户在其名称中包含此单词的组中”。但是您可以搜索“具有此名称的用户”并告诉搜索返回 memberOf 属性。然后使用这些搜索结果在 memberOf 中查找并找到具有所需名称的组。
    • 我刚刚看了你更新的代码。看起来你已经在这样做了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2012-08-30
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多