首页 > 解决方案 > 在 python-ldap 中关闭搜索继续结果?

问题描述

使用带有参数的python-ldap.search_s()函数(https://www.python-ldap.org/en/python-ldap-3.3.0/reference/ldap.html#ldap.LDAPObject.search_s)...

base = DC=myorg,DC=local
filterstr = (&(sAMAccountName={login})(|(memberOf=CN=zone1,OU=zones,OU=datagroups,DC=myorg,DC=local)(memberOf=CN=zone2,OU=zones,OU=datagroups,DC=myorg,DC=local)))

...尝试匹配特定的 AD 用户。然而,当我查看返回的结果(带有login = myuser)时,我看到如下内容:

[
   (u'CN=zone1,OU=zones,OU=datagroups,DC=myorg,DC=local', {u'sAMAccountName': ['myuser']}), 
   (None, [u'ldap://DomainDnsZones.myorg.local/DC=DomainDnsZones,DC=myorg,DC=local']), 
   (None, [u'ldap://ForestDnsZones.myorg.local/DC=ForestDnsZones,DC=myorg,DC=local']), 
   (None, [u'ldap://myorg.local/CN=Configuration,DC=myorg,DC=local'])
]

列表中有多个其他匹配项(除了 myuser sAMAccountName 匹配项)与搜索过滤器无关。查看文档(https://www.python-ldap.org/en/python-ldap-3.3.0/faq.html),这些似乎是“搜索延续”/搜索库位于时包含的引用域级别,它说可以通过包含类似...的代码来关闭它们

l = ldap.initialize('ldap://foobar')
l.set_option(ldap.OPT_REFERRALS,0)

以及尝试

ldap.set_option(ldap.OPT_REFERRALS,0)
l = ldap.initialize('ldap://foobar')

...但是添加此代码根本不会改变行为,我得到相同的结果(请参阅https://www.python-ldap.org/en/python-ldap-3.3.0/reference/ldap.html?高亮=set_option#ldap.set_option)。

我在这里误解了什么吗?有谁知道如何让这些停止弹出?任何人都知道这个函数返回的元组的结构(文档没有描述)?

标签: python-ldap

解决方案


刚刚与其他更熟悉的人交谈,python-ldap并被告知OPT_REFERRALS正在控制您是否自动遵循推荐,但这并不会阻止 AD 发送它们

目前,他们推荐的唯一方法是使用以下内容过滤这些值:

results = ldap.search_s(...)
results = [ x for x in results if x[0] is not None ]

注意返回的结果的结构search_s()

[
    ( dn, {
         attrname: [ value, value, ... ],
         attrname: [ value, value, ... ],
    }),
]

当它是一个引用时,它是一个 DN,None并且条目 dict 被替换为一个 URI 数组。

*(请注意,在search_s调用中,您也可以请求在搜索中返回特定属性)

*(请注意,由于我的基本 DN 是域级别的路径,因此使用该ldap.set_option(ldap.OPT_REFERRALS,0)片段仍然有用,只是为了阻止它search_s()实际上沿着引用路径向下(这增加了几秒钟的搜索时间))

同样,我相信这个问题是由于基本 DN 是域级别的路径(除非有其他的base_dn,或者search.filter我可以使用组用户分散在我所缺少的域中的各种 AD 路径的事实) .


推荐阅读