コマンドラインからうまく機能するADのパスワードを変更するためのPythonスクリプトを作成しました。現在、パスワード変更ページを作成するために、そのスクリプトを Django に転送しています。1 つのことを除いてすべてが機能しているようです。何らかの理由で、Unicode オブジェクトではなく文字列を AD に渡す必要があることを示唆する TypeError が Django で発生し続けます。もちろん、これを行うと、AD はパスワードがユニコードではなくなるため抗議します。単純なものを見落としていると思いますが、何がわかりません。
以下は、動作すると思われるview.pyコードです(コマンドラインバージョンでも動作します)。パスワードに unicode() を追加して、実際には unicode であることを示しましたが、これらの行の前では間違いなく unicode です。
import ldap
def changePassword(request):
t = ldap.initialize(server)
. . .
t.simple_bind_s('**********', '****')
. . .
mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [unicode(oldPassword)]),
(ldap.MOD_ADD, 'unicodePwd', [unicode(newPassword)])]
t.modify_s(dn, mod_attrs)
エラー:
('expected a string in the list', u'pass!word')
Request Method: POST
Request URL: http://127.0.0.1:8000/index/
Django Version: 1.4.2
Exception Type: TypeError
Exception Value:
('expected a string in the list', u'pass!word')
Exception Location: /usr/lib/python2.7/dist-packages/ldap/ldapobject.py
in _ldap_call, line 96
Python Executable: /usr/bin/python
Python Version: 2.7.3
変更されたバージョンでは例外は発生しませんが、パスワードも変更されません (パスワードが Unicode で渡されないため)。
mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [str(oldPassword)]),
(ldap.MOD_ADD, 'unicodePwd', [str(newPassword)])]
t.modify_s(dn, mod_attrs)
このユニコードの問題につながる可能性があることを知っている人はいますか? Django で例外を防ぎ、Unicode を保持できれば、このコードは機能すると思います。
あなたが提供できるかもしれない洞察を前もって感謝します。