2016-11-07 4 views
0

私はPython-LDAPモジュールを使用しており、ログインしているユーザに対してクエリを作成しようとしています。ユーザー名がクエリに渡されます。文字列としてのユーザー名を入力すると、正しく結果が出力されますユーザ名が変数であるLDAP検索

しかし、私は(ユーザー名)変数を渡すようにしようとした場合、それは LDAPError - FILTER_ERROR: {'desc': u'Bad search filter'}を返す私は、異なる組み合わせの数を試みたが、同じエラーが返さ取得し続けてきました。ここの洞察はすばらしいでしょう! 、最小完全、かつ検証例えば編集

import ldap 

LDAP_SERVER = "ldap://myldapserver.domain.ad:389" 
username = r"domain\serviceAccount" 
password = "Password" 

l = ldap.initialize(LDAP_SERVER) 
def login(username, password): 
    try: 
     l.simple_bind_s(username, password) 
     base = "OU=Users,OU=Group,DC=domain,DC=ad" 

     criteria = "(&(objectClass=user)(sAMAccountName=anActualUsername))" #WORKS  
     criteria = '(&(objectClass=user)(sAMAccountName=%s))' % username #DOESNT WORK 
     criteria = "(&(objectClass=user)" + "(sAMAccountName=" + username + "))" #DOESNT WORK 

     attributes = ['displayName'] 
     result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes) 
     print result 
    except ldap.INVALID_CREDENTIALS: 
     return False 
    return True 

login(username,password) 
+1

いずれの場合も 'print criteria'と' print repr(criteria) 'をお勧めします。 –

+0

私の編集で結果を追加しました – Infinity8

+0

@Robᵩ他のアイデア?私はすべてを試したような気がする。 – Infinity8

答えて

0

私は適切な文字のエスケープのためldap.filter.filter_formatを使用する必要がありました。

import ldap.filter 

criteria= ldap.filter.filter_format('(&(objectClass=user)(sAMAccountName=%s))', [username]) 
0

は、あなたの文字列をエンコードしてみましたか? 、あなたがドメインで名前を使用し、「動かない」場合

(&(objectClass=user)(sAMAccountName=bobsmith)) 

:「WORKS」の場合には

criteria = ('(&(objectClass=user)(sAMAccountName=%s))' % username).encode('utf8') 
+0

ちょうどこれを試しましたが、残念ながらサイコロはありません。まだ「悪い検索フィルタ」を取得しています – Infinity8

1

は、あなたのフィルタ文字列は、ドメインのないシンプルな名前が含まれています。それがエスケープされていない限り

(&(objectClass=user)(sAMAccountName=domain\serviceAccount) 

文字\は、フィルタ文字列に許可されていません。

これを修正する方法は、LDAPサーバーに存在するデータによって異なります。おそらく、この:

criteria = '(&(objectClass=user)(sAMAccountName=%s))' % (
    username if '\\' not in username else username.split('\\')[1]) 

それとも、この:

criteria = '(&(objectClass=user)(sAMAccountName=%s))' % (
    ldap.filter.escape_filter_chars(username)) 
関連する問題