在 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,DC=local)))

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

[
   (u'CN=zone1,DC=local',{u'sAMAccountName': ['myuser']}),(None,[u'ldap://DomainDnsZones.myorg.local/DC=DomainDnsZones,DC=local']),[u'ldap://ForestDnsZones.myorg.local/DC=ForestDnsZones,[u'ldap://myorg.local/CN=Configuration,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?highlight=set_option#ldap.set_option)。

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

解决方法

刚刚与更熟悉 python-ldap 的其他人交谈,并被告知 OPT_REFERRALS 正在控制您是否自动关注推荐,但它并没有停止向他们发送广告

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

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

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

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

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

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

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

同样,我认为这个问题是由于基本 DN 是域级路径(除非我可以使用其他一些 base_dnsearch.filter,因为组用户分散跨域中的各种 AD 路径,但我缺少)。