2016-08-23 100 views
0

我想在Python中實現一個基本的LDAP身份驗證腳本,我試圖只執行一個簡單的LDAP搜索,看看它是否作品。我相信我已經正確創建並設置了我的LDAP對象和連接。Python的LDAP:LDAPObject.search_s()的作品,但LDAPObject.search()不

綁定後,我嘗試執行搜索。使用LDAPObject.search_s()方法成功返回包含用戶信息的字符串列表。但是,當我使用LDAPObject.search()方法時,該方法返回結果代碼2,這是一個協議錯誤。我想使用search()方法的原因是因爲它返回一個int而不是一個列表。根據我所瞭解的the Python LDAP documentation,這兩個方法可以採用相同的參數,所以我不明白爲什麼一個方法返回錯誤而不是另一個。

這裏是我的代碼:

import ldap 
import getpass 

# get login info 

username = raw_input("Enter your username: ") 
password = getpass.getpass("Enter your password: ") 

ldap_server = "LDAP://ipaddress:port" 
base_dn = "OU=Domain Users,DC=dummyname,DC=com" 
user_dn = username + "@dummyname.com" 
search_filter = "(&(objectClass=user)(sAMAccountName=" + username + "))" 

ld = ldap.initialize(ldap_server); 
ld = ldap.open(ldap_server) 
ld.protocol_version = 3 
ld.set_option(ldap.OPT_REFERRALS, 0) 

# bind user information to ldap connection 

try: 
    print ld.simple_bind_s(user_dn, password) 
    results = ld.search(base_dn, ldap.SCOPE_SUBTREE, search_filter) 
    print results 
    ld.unbind_s() 
except ldap.INVALID_CREDENTIALS: 
    print "Your username or password is invalid." 
except Exception as e: 
    print("Connection unsuccessful: " + str(e.message)) 
    ld.unbind_s() 

這段代碼的完整輸出:

Enter your username: myusername 
Enter your password: 
(97, [], 1, []) 
2 

任何幫助將不勝感激。謝謝。

回答

0

以下命令使用不阻止等待返回值的異步搜索。它返回的int實際上是LDAPObject的MSGID,您在返回時需要獲取返回值。

msgid = ld.search(base_dn, ldap.SCOPE_SUBTREE, search_filter) # Returns int of msgid without blocking 

爲了得到你需要調用

actual_results = ld.result(msgid) # Blocks until search is done and returns [(dn,attrs)] 

使用以下命令的實際結果會導致LDAPObject在「順序」從而阻斷程序來搜索。

results = ld.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter) # blocks until all results are received [(dn,attrs)] 
相關問題