1

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.SequenceOfuniv.Sequenceuniv.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

4

1 に答える 1