2012-02-25 61 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