使用python-ldap搜索活动目录。如何排除具有特定OU
的特定用户?在组"GON"中搜索,并希望它只返回具有OU=Users
而不是OU=Foo
的常规用户。
filter = "(&(CN=GON)(!(OU=Foo)))"
attr = ["member"]
scope = ldap.SCOPE_SUBTREE
result = l.search_s(basdn, scope, filter, attr)
得到的结果:
[('CN=GON,OU=App,OU=Groups,DC=com', {'member': [b'CN=user1,OU=Users,DC=com', b'CN=user2me,OU=Foo,DC=com',]}), (None, ['ldap://skogen.com/CN=Sche,CN=Conf,DC=com']), (None, ['ldap://skogen.com/CN=Sche,CN=Conf,DC=com'])]
想要的结果:
[('CN=GON,OU=App,OU=Groups,DC=com', {'member': [b'CN=user1,OU=Users,DC=com']}), (None, ['ldap://skogen.com/CN=Sche,CN=Conf,DC=com']), (None, ['ldap://skogen.com/CN=Sche,CN=Conf,DC=com'])]
简短的回答是否定的。
查询筛选器只影响返回的对象,而不影响为该对象返回的属性值。因此(CN=GON)
的滤波器意味着;我想找到一个CCD_ 5是CCD_;并且CCD_ 7值告诉它返回哪些属性。LDAP没有提供修改这些属性返回方式的方法。
您可以在搜索完成后对其进行筛选。循环遍历每个值并删除不需要的值。
查找一个特定OU中属于组成员的所有用户的另一种方法是查看memberOf
属性。这将在Active Directory中工作,但我不确定OpenLDAP(我认为必须配置memberOf
才能工作,但不确定——我从未真正使用过OpenLDAP(。
因此,在AD中,您可以进行如下查询:
basedn = "OU=Users,DC=com"
filter = "(&(objectClass=user)(objectCategory=person)(memberOf=CN=GON,OU=App,OU=Groups,DC=com))"
attr = ["distinguishedName"]
scope = ldap.SCOPE_SUBTREE
result = l.search_s(basdn, scope, filter, attr)
这在林中只有一个域的AD域中运行良好。但在多域林中,请注意memberOf
。