在 python-ldap 中关闭搜索继续结果?

Turn off search continuation results in 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?highlight=set_option#ldap.set_option)。

我是不是误会了什么?任何人都知道如何让这些停止弹出?有人知道这个函数returns(文档没有描述)的元组结构吗?

刚刚与更熟悉 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, ... ],
    }),
]

当它是引用时,它是 None 的 DN,并且条目字典被 URI 数组替换。

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

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

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