Python LDAP:LDAPObject.search_s() 有效,但 LDAPObject.search() 无效
Python LDAP: LDAPObject.search_s() works, but LDAPObject.search() doesn't
我正在尝试在 Python 中实现一个基本的 LDAP 身份验证脚本,并且我正在尝试执行一个简单的 LDAP 搜索并查看它是否有效。我相信我已经正确地创建和设置了我的 LDAP 对象和连接。
绑定后,我尝试执行搜索。使用 LDAPObject.search_s() 方法成功 returns 包含用户信息的字符串列表。但是,当我使用 LDAPObject.search() 方法时,方法 returns 结果代码为 2,这是一个协议错误。我想使用 search() 方法的原因是因为它 returns 是一个 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
如有任何帮助,我们将不胜感激。谢谢。
以下命令使用不阻塞等待 return 值的异步搜索。 int it returns 实际上是 LDAPObject 的 MSGID,当它被 returned 时,您需要获取它的 return 值。
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 在 "sequential order" 中搜索,从而阻止程序。
results = ld.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter) # blocks until all results are received [(dn,attrs)]
我正在尝试在 Python 中实现一个基本的 LDAP 身份验证脚本,并且我正在尝试执行一个简单的 LDAP 搜索并查看它是否有效。我相信我已经正确地创建和设置了我的 LDAP 对象和连接。
绑定后,我尝试执行搜索。使用 LDAPObject.search_s() 方法成功 returns 包含用户信息的字符串列表。但是,当我使用 LDAPObject.search() 方法时,方法 returns 结果代码为 2,这是一个协议错误。我想使用 search() 方法的原因是因为它 returns 是一个 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
如有任何帮助,我们将不胜感激。谢谢。
以下命令使用不阻塞等待 return 值的异步搜索。 int it returns 实际上是 LDAPObject 的 MSGID,当它被 returned 时,您需要获取它的 return 值。
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 在 "sequential order" 中搜索,从而阻止程序。
results = ld.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter) # blocks until all results are received [(dn,attrs)]