LDAP 查询过滤器用户组如 *x*
LDAP Query Filter User's with Groups Like *x*
我目前正在使用 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%'
更新:
在查看了 Gabriel 的回答后,我 运行 这个。
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()]
但我确实想知道,我可以搜索名称中带有 'Keyword' 的组并从中构建过滤器吗?此外,那会更快吗?我假设它会因为 AD 可能散列组成员身份。
我会去读一读,但我假设组名可以通过通配符搜索?
我建议你使用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 目录可能允许它。
如果你需要检查用户是否是组的成员,那么你可以告诉你的搜索return搜索中的memberOf
属性(我不知道phython,但你应该有办法告诉它你想要哪些属性 returned)。然后您可以遍历 memberOf
属性中的组并查找该关键字。
我目前正在使用 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%'
更新:
在查看了 Gabriel 的回答后,我 运行 这个。
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()]
但我确实想知道,我可以搜索名称中带有 'Keyword' 的组并从中构建过滤器吗?此外,那会更快吗?我假设它会因为 AD 可能散列组成员身份。
我会去读一读,但我假设组名可以通过通配符搜索?
我建议你使用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 目录可能允许它。
如果你需要检查用户是否是组的成员,那么你可以告诉你的搜索return搜索中的memberOf
属性(我不知道phython,但你应该有办法告诉它你想要哪些属性 returned)。然后您可以遍历 memberOf
属性中的组并查找该关键字。