2016-06-09 66 views
1

我想获得的所有PC从LDAP在本地网络中,所以我想(的变化)这样的:蟒蛇LDAP3搜索LDAPOperationsErrorResult

import ldap3 
from ldap3 import ALL_ATTRIBUTES, SUBTREE, ALL 
import dns.resolver 
import socket 

def get_ldap_server(): 
    domain_name = socket.getfqdn().lstrip(socket.gethostname())  
    answers = dns.resolver.query('_ldap._tcp'+domain_name, rdtype='srv') 
    #for srv in answers: 
    return answers[0].target.to_text()[:-1] 

srv_name = get_ldap_server() 
print srv_name 
server = ldap3.Server(srv_name, get_info=ALL) 
with ldap3.Connection(server) as c: 
    print "Bound", c.bound 
    c.search(search_base='dc='+', dc='.join(srv_name.split('.')[1:]), 
      search_filter='(objectCategory=computer)', 
      search_scope=SUBTREE, 
      attributes=ALL_ATTRIBUTES, 
      get_operational_attributes=True) 

    print(c.response) 

但我得到的是: LDAPOperationsErrorResult:LDAPOperationsErrorResult - 1 - operationsError - 无 - 000004DC:LdapErr:DSID-0C090748,注释:为了执行此操作,必须在连接上成功完成绑定,data 0,v2580 - searchResDone - 无

尽管“Bound”为“True ”。

我正在使用python 2.7。任何帮助将不胜感激!

+0

正如cannatag指出的,我需要进行身份验证才能获取此信息。但是,错误消息很糟糕,因为绑定实际上成功了,这就是为什么没有他的帮助,我被卡住了。\ rant – TimO

回答

2

您没有在连接对象中提供任何用户名或密码,因此会执行匿名绑定。

尝试在“with”语句的Connection定义中添加username = xxx和password = yyy。

+0

是否有可能获取当前用户的凭据以登录? 它似乎可以在linux命令行上工作,例如 ldapsearch -H“ldap://dc.domain.com”-b“dc = domain,dc = com”“objectclass = computer” 就足够了,您不需要再次提供用户凭据。 – TimO

+0

在这里,您正在使用objectCategory = computer在原始问题的代码中搜索objectclass = computer。这些是两种不同的属性类型(http://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx#Filter_on_objectCategory_and_objectClass)。 – cannatag