2012-02-25 60 views
4

我会试着包括尽可能详细越好,但考虑这样的情况:Python的LDAP和Active Directory问题

对于隐私的关注可以说我有一个Active Directory基础结构如下所示:

微软。 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") 

在我的剧本我正在寻找一个用户帐户,我用以下搜索:

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']}]) 

然而,似乎在随机的,我会得到的结果如下所示:

[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])] 

虽然结果是有道理的 - 门在csharp.microsoft.com上不存在,他存在于microsoft.com DC - 它仍然非常令人费解,因为我的印象是使用OPT_REFERRALS设置为0会告诉Python LDAP模块不使用引用。 为了让事情更有趣的我有时也得到这样的结果如下:

[(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解决了我们遇到的交叉污染问题。

回答

3

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

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

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

+0

这就是我在不同的文章中看到的,然而,似乎只有一个回复 - 转介。如果我忽略了这个结果,那么自然就不会有结果。也许,我使用了错误的方法? – 2012-03-02 01:54:17

+0

在连接的服务器上是否有负载平衡器?也许这可能是问题。 – 2012-03-02 03:13:57

+0

涉及负载均衡器,但它不应该影响LDAP系统,因为它旨在在两个LAMP服务器之间进行负载平衡。 LDAP查询可以从这两个LAMP服务器中的一个到两个AD服务器之一(两个AD服务器每个都有一个Microsoft.com的A记录)。 – 2012-03-02 20:05:03