2009年11月13日金曜日

python-ldapでpaged controlのsearch処理

Active Directoryからエントリを検索するときに、検索結果が1000件を越えると、
size limitのエラーになってしまう。
このような場合に備えて、paged control付きのsearchをpython-ldapでどのように
実装するか調べてみた。
python-ldapのsampleに入っているらしいけど、次のようなコードでできた。


#!/usr/bin/python
import ldap
from ldap.controls import SimplePagedResultsControl
url = "ldap://adserver.example.com"
base = "dc=example,dc=com"
filter = "sAMAccountName=*"
page_size = 1000
conn = ldap.initialize(url)
conn.simple_bind_s("Administrator@example.com","password")
lcon = SimplePagedResultsControl(ldap.LDAP_CONTROL_PAGE_OID, True, (page_size, ''))
msgid = conn.search_ext(base, ldap.SCOPE_SUBTREE, filter, serverctrls=[lcon])
pages = 0
while True:
pages += 1
print "============ Get page %d ==============" % (pages,)
(rtype, rdata, rmsgid, serverctrls) = conn.result3(msgid)
for item in rdata:
print item[0]
pctrls = [
c
for c in serverctrls
if c.controlType == ldap.LDAP_CONTROL_PAGE_OID
]
if pctrls:
print pctrls
(est, cookie) = pctrls[0].controlValue
if cookie:
lcon.controlValue = (page_size, cookie)
msgid = conn.search_ext(base, ldap.SCOPE_SUBTREE, filter, serverctrls=[lcon])
else:
break
else:
break



0 件のコメント:

コメントを投稿