Python LDAP:LDAPObject.search_s()有效,但LDAPObject.search()不起作用

时间:2016-08-23 19:27:44

标签: python active-directory ldap ldap-query

我正在尝试在Python中实现基本的LDAP身份验证脚本,我正在尝试执行简单的LDAP搜索并查看它是否有效。我相信我已经正确创建并设置了我的LDAP对象和连接。

绑定后,我尝试执行搜索。使用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

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分: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)]