python-ldap を使用して、通常の LDAP サーバーであるかのように ActiveDirectory を検索します。SSL、認証、すべてが機能します。
ここで、OID を持つRFC 2891 で定義されたサーバー側のソート要求制御を使用したいと考えています1.2.840.113556.1.4.473
。
Python-ldap はそのままではそのコントロールをサポートしていないため、自分で作成する必要があります。これは私がしました :
server_side_sort = ldap.controls.RequestControl('1.2.840.113556.1.4.473', True)
しかし、BER でエンコードされた ASN.1 制御値encodedControlValue
であるパラメーターを計算する方法がわかりません。
、 、など、pyasn1
計算するための多くの部分があることがわかります。pyasn1のRFC2251 モジュールを見て、私はこれを思いつきました:univ.SequenceOf
univ.Sequence
univ.Boolean
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-ldapが受け入れる属性にサーバー側のソート制御値を作成するにはどうすればよいですか?ldap.search_ext