2016-08-23 10 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に従って理解しているところから、2つのメソッドは同じ引数を取ることができるので、なぜ一方のメソッドがエラーを返すのか、もう一方のメソッドは返さないのか分かりません。このコードの

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です。あなたは、以下のコマンドを使用して

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

を呼び出す必要があり、実際の結果を得るために

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

はLDAPObjectは、このようにプログラムをブロックする「順番」で検索する原因となります。

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