Python3虚拟环境添加LDAP用户遇Tuple_to_LDAPMod错误求助
解决LDAP添加用户时的Tuple_to_LDAPMod错误
这个错误的核心原因很明确:Python的ldap模块要求所有属性值必须是字节字符串(bytes类型),但你代码里用的都是普通的Unicode字符串(str类型),模块没法直接把普通字符串转换成LDAP需要的格式,所以抛出了这个报错。
修复方案
只需要把modlist里的所有字符串值转换成字节串就行,有两种简单的方式:
方式1:手动给每个字符串加b前缀
直接在每个字符串前面加上b,把它变成字节类型,修改后的代码如下:
import ldap # 初始化连接 con = ldap.initialize('ldap://127.0.0.1') # 如果LDAP服务器需要认证,记得添加绑定操作(根据你的实际配置修改) # con.simple_bind_s("cn=admin,dc=example,dc=com", "your_admin_password") ldap_base = "dc=example,dc=com" dn = "uid=hasnain,ou=Users,dc=example,dc=com" modlist = { "objectClass": [b"inetOrgPerson", b"posixAccount", b"shadowAccount"], "uid": [b"hasnain"], "sn": [b"Hasnain"], "givenName": [b"Muhammad"], "mail": [b"hasnain@example.com"], "cn": [b"Muhammad Hasnain"], "displayName": [b"Muhammad Hasnain"], "gecos": [b"Muhammad Hasnain"], "uidNumber": [b"10001"], "gidNumber": [b"5001"], "loginShell": [b"/bin/bash"], "homeDirectory": [b"/home/hasnain"] } # 执行添加操作 result = con.add_s(dn, ldap.modlist.addModlist(modlist))
方式2:批量转换字符串为字节串
如果属性很多,手动加b太麻烦,可以用字典推导式批量转换所有值:
import ldap con = ldap.initialize('ldap://127.0.0.1') # 可选:绑定认证 # con.simple_bind_s("cn=admin,dc=example,dc=com", "your_admin_password") ldap_base = "dc=example,dc=com" dn = "uid=hasnain,ou=Users,dc=example,dc=com" # 先定义普通字符串的modlist modlist_str = { "objectClass": ["inetOrgPerson", "posixAccount", "shadowAccount"], "uid": ["hasnain"], "sn": ["Hasnain"], "givenName": ["Muhammad"], "mail": ["hasnain@example.com"], "cn": ["Muhammad Hasnain"], "displayName": ["Muhammad Hasnain"], "gecos": ["Muhammad Hasnain"], "uidNumber": ["10001"], "gidNumber": ["5001"], "loginShell": ["/bin/bash"], "homeDirectory": ["/home/hasnain"] } # 批量转换为字节串 modlist = {k: [v.encode('utf-8') for v in vs] for k, vs in modlist_str.items()} result = con.add_s(dn, ldap.modlist.addModlist(modlist))
额外提醒
如果你的LDAP服务器不是允许匿名写入的,一定要在初始化连接后添加simple_bind_s操作,传入管理员的DN和密码,否则会遇到权限不足的错误。
内容的提问来源于stack exchange,提问作者Umar Draz
相关产品推荐
相关产品推荐

