Я использую python-ldap для поиска ActiveDirectory, как если бы это был обычный сервер LDAP. Он работает, SSL, аутентификация и все такое.Создайте «последовательность последовательности» ldap.controls.RequestControl object
Теперь я хочу использовать server side sort request control defined in RFC 2891, у которого есть OID 1.2.840.113556.1.4.473
.
Python-ldap не поддерживает этот контроль из коробки, поэтому я должен сам создать его. Я сделал это:
server_side_sort = ldap.controls.RequestControl('1.2.840.113556.1.4.473', True)
Но я не знаю, как вычислить параметр encodedControlValue
, который the BER-encoded ASN.1 control value.
Я вижу, что pyasn1
имеет много частей к comptue его, как univ.SequenceOf
, univ.Sequence
и univ.Boolean
. Глядя на RFC2251 module of pyasn1, я пришел с этим:
class LDAPString(univ.OctetString): pass
class AttributeDescription(LDAPString): pass
class MatchingRuleId(LDAPString): pass
class ServerSideSortOnName(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('attributeDesc', AttributeDescription('name')),
namedtype.NamedType('reverseOrder', univ.Boolean(False)))
class ServerSideSortControl(univ.SequenceOf):
componentType = ServerSideSortOnName()
sss = ServerSideSortControl()
serversidesort = ldap.controls.RequestControl('1.2.840.113556.1.4.473',True,sss)
Имя не может быть проиндексированы, я знаю. Я думал, что это может помочь отладки в соответствии с base64 value shown on this MSDN snippet.
Но когда я добавить этот элемент управления (который может даже не быть действительными) для ldap.search_ext, я получаю ошибку TypeError: ('expected a string', ServerSideSortControl())
Как создать значение на стороне сервера управления сортировать по атрибуту name
, что питон-ldap.search_ext
LDAP будет принимать, используя pyasn1 или подобное?
Спасибо! Исходный код не был запущен как есть. Я обновил его с помощью той, которая работает на моей машине. – ixe013