python-ldap在python腳本中與交互界面不同有些屬性必須寫成LIST格式

從win客戶端操作用python-ldap大規模的導入用戶
主要參考文章https://www.cnblogs.com/littlehb/p/9379851.html

先用交互界面進行原型測試

>>> import hashlib
>>> hashlib.md5("ysk").hexdigest()
'958c6b03f7b874c20c91ce2ee7b3a950'
>>> import binascii
>>> import base64
>>> base64.b64encode(binascii.a2b_hex('958c6b03f7b874c20c91ce2ee7b3a950'))
'lYxrA/e4dMIMkc4u57OpUA=='
>>> def hash_md5(data):
...   md = hashlib.md5()
...   md.update(str(data))
...   a=md.digest()
...   b=base64.b64encode(a)
...   return b
...
>>> hash_md5('ysk')
'lYxrA/e4dMIMkc4u57OpUA=='
>>> import ldap,ldap.modlist
>>> l=ldap.initialize('ldap://10.16.97.210:389')
>>> l.protocal_version =ldap.VERSION3
>>> l.simple_bind('cn=admin,dc=mydebian210,dc=mydomain,dc=net','secret_password')
>>> addDN='uid=ysk,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net'
>>> attrs = {}
>>> attrs['cn']='ysk'
>>> attrs['givenName']=u'客戶'.encode('utf-8')
>>> attrs['objectClass']=['inetOrgPerson','top']
>>> attrs['userPassword']='{MD5}lYxrA/e4dMIMkc4u57OpUA=='
>>> attrs['sn']=u'-公開文檔'.encode('utf-8')
>>> ldif=ldap.modlist.addModlist(attrs)
>>> l.add_s(addDN,ldif)
(105, [], 2, [])
>>> l.unbind_s()
>>>
>>>
>>> import ldap,ldap.modlist
>>> l=ldap.initialize('ldap://10.16.97.210:389')
>>> l.protocal_version =ldap.VERSION3
>>> try :
...     i=l.simple_bind_s('uid=ysk,ou=web_ftp_users,dc=mydebian210,dc=mydomain,dc=net','ysk')[0]
... except ldap.INVALID_CREDENTIALS:
...     i=0
>>>print i==97
True
>>> ^Z

但是在python腳本中同樣的內容執行卻出錯,#出現TypeError: ('expected a string in the list', u'0')錯誤

在網絡上搜索,解決辦法是有些屬性必須寫成LIST格式。見這個網頁https://github.com/python-ldap/python-ldap/issues/237

import ldap,ldap.modlist

import hashlib
import binascii
import base64

#從其他系統Oracle中取出用戶名和MD5密文result


l=ldap.initialize('ldap://10.16.97.210:389')
l.protocal_version =ldap.VERSION3
l.simple_bind('cn=admin,dc=mydebian210,dc=mydomain,dc=net','secret_password')

#出現TypeError: ('expected a string in the list', u'0')錯誤見以下網頁
#https://github.com/python-ldap/python-ldap/issues/237
#解決辦法就一是item[0]雖然沒有中文,但是unicode,必須轉換成str,其他的文本字段用[]變爲list

for item in result :
    addDN='uid=%s,ou=indiaudit,dc=mydebian210,dc=mydomain,dc=net' % (item[0],)
    attrs = {}
    attrs['cn']=str(item[0])
    attrs['givenName']=[str(item[1].encode('utf-8')),]
    attrs['objectClass']=['inetOrgPerson','top']
    print ['{MD5}%s' % (base64.b64encode(binascii.a2b_hex(item[2])),),]
    attrs['userPassword']=['{MD5}%s' % (base64.b64encode(binascii.a2b_hex(item[2])),),]
    attrs['sn']=[str(item[1].encode('utf-8')),]
    ldif=ldap.modlist.addModlist(attrs)
    l.add_s(addDN,ldif)


l.unbind_s()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章