【问题标题】:LDAP search with username as variable使用用户名作为变量的 LDAP 搜索
【发布时间】:2016-11-07 22:57:03
【问题描述】:

我正在使用 Python-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)

【问题讨论】:

  • 我建议你 print criteriaprint repr(criteria) 在每种情况下。
  • 刚刚在我的编辑中添加了结果
  • @Robᵩ 还有其他想法吗?我觉得我什么都试过了。
  • 我建议您将您的原始程序缩减为能够证明问题的最小完整程序。将该程序完整复制粘贴到您的问题中,仅编辑任何敏感信息或凭据。请参阅minimal reproducible example 了解更多信息。
  • 好的,现在用最小的例子彻底清理了。

标签: python active-directory ldap python-ldap


【解决方案1】:

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

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

【讨论】:

  • 刚试过这个,不幸的是没有骰子。仍然收到“错误搜索过滤器”
【解决方案2】:

在“WORKS”的情况下,您的过滤器字符串包含一个没有域的简单名称:

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

在“不起作用”的情况下,您使用带有域的名称:

    (&(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))

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2014-12-11
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      相关资源
      最近更新 更多