Python LDAP和Active Directory问题

Nat*_*ams 5 python active-directory

我将尝试包括尽可能多的细节,但请考虑以下情况:

对于隐私问题,可以说我有一个Active Directory基础结构,如下所示:

microsoft.com
和一些子域:
csharp.microsoft.com
vb.microsoft.com

所有用户帐户都存储在microsoft.com。

我从以下代码开始:

import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)
Run Code Online (Sandbox Code Playgroud)

(我知道我可能应该拥有该域的证书,但是您可以怎么做)

然后,我进行如下连接:

conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
Run Code Online (Sandbox Code Playgroud)

在我的脚本中,我正在搜索用户帐户,并且使用以下搜索:

result_id = conn.search("DC=microsoft,DC=com",
                                ldap.SCOPE_SUBTREE,
                                "(&(CN=gates)(!(objectClass=contact)))",
                                None)
result_type,result_data = conn.result(result_id,0)
Run Code Online (Sandbox Code Playgroud)

好的,这很有效。...大部分时间。
当它起作用时,我会得到以下效果:

[("CN=gates,OU=Users,DC=microsoft,DC=com", {'sAMAccountName':['gates']}])
Run Code Online (Sandbox Code Playgroud)

但是,似乎随机得到的结果如下:

[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
Run Code Online (Sandbox Code Playgroud)

虽然结果很合理-csharp.microsoft.com上不存在门,而microsoft.com DC上存在门-这仍然令人非常困惑,因为我印象是使用OPT_REFERRALS设置为0会告诉Python LDAP模块不要使用推荐。为了使事情变得更有趣,有时我还会得到如下结果:

[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
Run Code Online (Sandbox Code Playgroud)

所以我的问题-我做错了什么吗?

另外,还建议如果我使用“ OU = Users,DC = microsoft,DC = com”之类的搜索路径,而不是仅从根目录(“ DC = microsoft,DC = com”)中搜索LDAP客户端模块不会尝试使用引荐-这是准确的吗?

编辑

事实证明,该问题与LDAP不相关,而与WSGI配置错误有关。使用WSGIDaemonProcess解决了我们遇到的交叉污染问题。

Joh*_*don 5

将 ldap.OPT_REFERRALS 设置为 0 告诉服务器不要“追逐”引用,即不要解析它们。

以 None 作为第一个元素的结果是服务器告诉您“这是一个推荐,但您告诉我不要追逐它”的方式。至少这是我的理解。

如果您不想要推荐,只需忽略第一个元素为 None 的结果。