本人工作中用到ldap进行用户的管理等,我的主编程语言是python,所以用python对ldap进行操作,在私有云部分因为客户的ldap需求不一样,所以会产生一些问题,特此记录一下.
ldap其他问题暂且不谈,先说下解决 ”Size limit exceeded“ 的问题。
产生”Size limit exceeded“ 问题的原因就是客户端去ldap服务端查询,客户端想一次把查询到的多个数据返回,结果服务器不让,就产生了这个问题,解决办法有两个:
一、在ldap服务器上把一次可返回的数据的总量调大。
1、ldap一般运行在windows上,linux系统先不说,在windows上单击开始菜单,搜到Ntdsutil.exe程序后点击运行
2、输入:ldap policies, 然后enter
3、输入:connections, 然后enter
4、输入:connect to domain xxxxx.com, 然后enter(xxxxx.com是AD上绑定的域名)
5、输入:q,然后enter
6、输入:show values,然后enter(查看MaxPageSize)
7、输入:set MaxPageSize to 2000,然后enter
8、输入:commit changes,然后enter
然后重复第6步查看结果,无误后可键入quit退出。
第一种方法需要服务端做修改,但对于一些金融证券类的公司可能不行,因为他们认为这个风险不可控,值要设置多大才为最好?所以第二种方法需要修改客户端代码。
二、修改python代码,分页获取ldap服务器返回的信息,当时百度谷歌了很久,又遇到过'module' object has no attribute 'LDAP_CONTROL_PAGE_OID'的问题,现在终于搞定了,此方法不用管ldap的版本信息。
代码所用python版本: 2.7.6
import ldap from ldap.controls import SimplePagedResultsControl l = ldap.initialize('ldap://域名或ip') l.simple_bind_s('ldap用户', 'ldap用户密码') PAGE_SIZE = 500 #设置每页返回的条数 ATTRLIST = ['cn', 'displayName', 'name', 'telephoneNumber', 'objectClass', 'sAMAccountName'] #设置返回的属性值 pg_ctrl = SimplePagedResultsControl(True, size=PAGE_SIZE, cookie="") userdata = [] while True: msgid = l.search_ext('OU=xxx,OU=xxx,DC=xxx,DC=com', ldap.SCOPE_ONELEVEL, "(objectClass=user)", ATTRLIST, serverctrls=[pg_ctrl]) _a, res_data, _b, srv_ctrls = l.result3(msgid) print 'res_data', len(res_data) userdata.extend(res_data) cookie = srv_ctrls[0].cookie if cookie: pg_ctrl.cookie = cookie else: break print 'totalnum:', len(userdata)
代码要点为怎么用cookie值,代码中pg_ctrl的方法有:
其中size为每页返回的数据数量,可控,其他参数不做说明.
有问题欢迎指正.