Я думаю, что это общий вопрос ldap, но я написал пример кода на python.
Я могу искать объекты, если указать dn ниже «корня», но если я попытаюсь выполнить поиск в верхней части дерева, я получу ошибку:
import ldap
server = '<server address>'
realm = '<realm>'
realm_dn = ','.join(['DC=%s' % part for part in realm.lower().split('.')])
l = ldap.initialize('ldap://%s' % server)
auth_tokens = ldap.sasl.gssapi('')
l.sasl_interactive_bind_s('', auth_tokens)
system = 'CN=System,%s' % realm_dn
print('Containers at system:')
result = l.search_s(system, ldap.SCOPE_ONELEVEL, '(objectCategory=Container)', ['cn'])
for i in result:
print(i[-1]['cn'])
print('Containers at top:')
result = l.search_s(realm_dn, ldap.SCOPE_ONELEVEL, '(objectCategory=Container)', ['cn'])
for i in result:
print(i[-1]['cn'])
Первый поиск успешен и печатает все контейнеры в Системе. Я ожидаю, что второй поиск найдет контейнер 'System' (среди прочих), но это не так. Вместо этого я получаю эту ошибку:
File "test_ldap_search.py", line 19, in <module>
result = l.search_s(realm_dn, ldap.SCOPE_ONELEVEL, '(objectCategory=Container)', ['cn'])
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 831, in search_s
return self.search_ext_s(base,scope,filterstr,attrlist,attrsonly,None,None,timeout=self.timeout)
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 825, in search_ext_s
return self.result(msgid,all=1,timeout=timeout)[1]
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 717, in result
resp_type, resp_data, resp_msgid = self.result2(msgid,all,timeout)
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 721, in result2
resp_type, resp_data, resp_msgid, resp_ctrls = self.result3(msgid,all,timeout)
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 728, in result3
resp_ctrl_classes=resp_ctrl_classes
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 735, in result4
ldap_result = self._ldap_call(self._l.result4,msgid,all,timeout,add_ctrls,add_intermediates,add_extop)
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 308, in _ldap_call
reraise(exc_type, exc_value, exc_traceback)
File "/usr/lib64/python2.7/site-packages/ldap/ldapobject.py", line 292, in _ldap_call
result = func(*args,**kwargs)
ldap.OPERATIONS_ERROR: {'info': u'000004DC: LdapErr: DSID-0C0906DD, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1771', 'desc': u'Operations error'}
Я знаю, что я аутентифицирован. Я kinit'd в качестве администратора. Таким образом, сообщение «Для выполнения этой операции необходимо выполнить привязку к соединению» вводит в заблуждение.
Я пытался найти любой тип объекта, и он всегда успешно работает ниже корня дерева и завершается неудачно в верхней части. Есть ли какой-то ldap-изм, которого я здесь не понимаю?
Сервер ldap является сервером Windows 2008 R2.