我使用 python-ldap 搜索 ActiveDirectory,就好像它是任何常规 LDAP 服务器一样。它可以工作,SSL,身份验证和一切。
现在我想使用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
参数,即BER-encoded ASN.1 control value。
我看到pyasn1
有很多部分可以计算它,univ.SequenceOf
比如univ.Sequence
和univ.Boolean
。查看 pyasn1 的RFC2251 模块,我想出了这个:
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)
我知道,名称可能未编入索引。我认为它可以帮助调试以匹配此 MSDN 片段上显示的 base64 值。
但是当我将此控件(甚至可能无效)添加到 ldap.search_ext 时,我得到了错误TypeError: ('expected a string', ServerSideSortControl())
如何使用 pyasn1 或类似方法在name
python-ldapldap.search_ext
将接受的属性上创建服务器端排序控制值?