再见。
事先,我为我的英语道歉,我的国家论坛和资源没有帮助。
我正在编写一个脚本,用于在AD中更改或创建用户密码
在研究了这个问题之后,很明显
1.要分配或更改的密码只能与服务器建立加密连接
1.只有编码utf-16-le时才需要发送密码
一般来说,第二种方法没有问题,但第一种方法有以下问题:
$ python ldap-test-starttls.py
Traceback (most recent call last):
File "ldap-test-starttls.py", line 9, in <module>
l.simple_bind_s( "cn=admin,ou=users,dc=test,dc=ru", "password" )
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 206, in simple_bind_s
msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 200, in simple_bind
return self._ldap_call(self._l.simple_bind,who,cred,EncodeControlTuples(serverctrls),EncodeControlTuples(clientctrls))
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 96, in _ldap_call
result = func(*args,**kwargs)
ldap.SERVER_DOWN: {'info': 'A TLS packet with unexpected length was received.', 'desc': "Can't contact LDAP server"}
脚本代码
import ldap
host = 'ldaps://ldap:636'
l = ldap.initialize(host)
l.set_option( ldap.OPT_X_TLS_DEMAND, True )
l.set_option( ldap.OPT_DEBUG_LEVEL, 255 )
username = 'someUser'
new_pass = 'ne$wP4assw0rd3!'
new_password = ('"%s"' % new_pass).encode("utf-16-le")
l.simple_bind_s( "cn=admin,ou=users,dc=test,dc=ru", "password" )
mod_attrs = [(ldap.MOD_REPLACE, 'unicodePwd', new_password)],[( ldap.MOD_REPLACE, 'unicodePwd', new_password)]
l.modify_s('CN=%s,dc=users,dc=test,dc=ru' % username, mod_attrs)
l.unbind_s()
print "Successfully changed password."
很有可能有人已经解决了类似的问题。是的,脚本正在CentOS上运行,使用py32win
是不可能的。
3条答案
按热度按时间slhcrj9b1#
经过更多的研究,我能够想出一个解决方案:
mkshixfv2#
我还认为
OPT_X_TLS_NEVER
会禁用TLS,所以请不要使用它。set_option(ldap.OPT_X_TLS_NEWCTX, ldap.OPT_ON)
:LDAP_OPT_X_TLS_NEWCTX
必须在调用ldap_set_option()
* 之后 * 调用以设置TLS属性,如果在设置属性之前调用它(如当前代码),则TLS属性不会复制到新的TLS上下文中。所以我的解决方案是
@参见Explain TLS/SSL gotchas
@参见TLS does not work for ldap, incorrect TLS & Debug attribute setting in rlm_ldap
anauzrmj3#
请注意连接字符串中的协议和端口:
将TLS与python-ldap一起使用:
SSL直接使用'ldapS://'!
它不使用start_tls_s()
来源:原始开发者github演示initialize.py