用户名作为变量进行LDAP搜索

时间:2016-11-07 22:57:03

标签: python active-directory ldap python-ldap

我正在使用Python-LDAP模块并尝试对登录用户进行查询。用户名将传递给查询。当我只是以字符串形式输入用户名时,我的结果会正确显示

如果我尝试传递它返回的(用户名)变量 LDAPError - FILTER_ERROR: {'desc': u'Bad search filter'} 我尝试了多种不同的组合,但仍然会返回相同的错误。这里的任何见解都会很棒!

编辑了Minimal,Complete和Verifiable示例:

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)

3 个答案:

答案 0 :(得分:1)

在“WORKS”案例中,您的过滤字符串包含一个没有域名的简单名称:

this.Comments?.Count()

在“不工作”的情况下,您使用域名:

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

除非转义过滤字符串,否则不允许使用字符 (&(objectClass=user)(sAMAccountName=domain\serviceAccount)

如何解决这个问题取决于ldap服务器中的数据。也许这个:

\

或许这个:

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

答案 1 :(得分:0)

您是否尝试对字符串进行编码?

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

答案 2 :(得分:0)

我需要使用ldap.filter.filter_format进行正确的字符转义。

import ldap.filter

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