Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python LDAP和Active Directory问题 我会尽量包含尽可能多的细节,但请考虑以下情况:_Python_Active Directory - Fatal编程技术网

Python LDAP和Active Directory问题 我会尽量包含尽可能多的细节,但请考虑以下情况:

Python LDAP和Active Directory问题 我会尽量包含尽可能多的细节,但请考虑以下情况:,python,active-directory,Python,Active Directory,出于隐私考虑,假设我有如下Active Directory基础架构: import ldap ldap.set_option(ldap.OPT_REFERRALS,0) ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER) conn = ldap.initialize("ldaps://microsoft.com:636") conn.simple_bind_s("user","pass") [(None, ['l

出于隐私考虑,假设我有如下Active Directory基础架构:

import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)
conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
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)
conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
(我知道我可能应该拥有该域的证书,但你能做什么)

然后,我进行如下连接:

import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)
conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
在我的脚本中,我正在搜索用户帐户,并使用以下搜索:

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)
好的,太好了,所以这在大多数情况下都有效。
当它起作用时,我得到的效果是:

[("CN=gates,OU=Users,DC=microsoft,DC=com", {'sAMAccountName':['gates']}])
然而,似乎是随机的,我会得到如下结果:

import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)
conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
虽然结果是有道理的——盖茨在csharp.microsoft.com上不存在,但他在microsoft.com DC上存在——这仍然非常令人费解,因为我的印象是,使用OPT_references设置为0将告诉Python LDAP模块不要使用引用。 为了让事情更有趣,我有时也会得到如下结果:

import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)
conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
所以我的问题是——我有什么做错了吗

另外,有人建议,如果我使用“OU=Users,DC=microsoft,DC=com”这样的搜索路径,而不是仅从根目录(“DC=microsoft,DC=com”)进行搜索,LDAP客户端模块将不会尝试使用引用-这是否准确

编辑

这个问题与LDAP无关,而是WSGI的错误配置。
使用WSGIDaemonProcess解决了我们遇到的交叉污染问题。

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

结果没有作为第一个元素是服务器告诉你“这是一个推荐,但你告诉我不要追查它。”至少这是我的理解


如果你不想要推荐,只需忽略第一个元素为“无”的结果。

这是我在不同的文章中读到的,但是,似乎只有一个答案——推荐。如果我忽略了这个结果,那么自然不会有结果。也许,我使用了错误的方法?您连接的服务器上有负载平衡器吗?也许这就是问题所在。其中涉及到一个负载平衡器,但它不应该影响LDAP系统,因为它旨在实现两台LAMP服务器之间的负载平衡。LDAP查询可能来自这两个LAMP服务器中的一个到两个AD服务器中的一个(这两个AD服务器都有Microsoft.com的A记录)。您是否可以直接连接到这两个LAMP服务器而不是通过负载平衡器?如果是这样,请在两台服务器上都尝试您的代码,看看您得到了什么结果。(我怀疑其中一台服务器返回“良好”结果,另一台服务器返回推荐。)经过大约一周的调试后,我们发现了一个问题,这可能就是问题所在。这些LDAP调用来自使用WSGI的Django应用程序。经过一些调试之后——看起来我们正在经历环境变量的交叉污染。LDAP连接凭据和搜索路径存储在环境变量中。当我得到更多信息时,我会更新我的原始问题。