用python解决ldap的Size limit exceeded问题!

    本人工作中用到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为每页返回的数据数量,可控,其他参数不做说明.

    有问题欢迎指正.


你可能感兴趣的:(python,limit,LDAP,size,exceeded)