我在尝试添加属性时遇到OBJECT_CLASS_VIOLATION。修改现有属性就可以了(即使是相同的属性,如果我先从 AD 添加它,然后修改它(。
首先,我以域管理员的身份,然后:
import ldap, ldap.sasl
l = ldap.initialize('ldap://TEST.DOM.DE')
auth_tokens = ldap.sasl.gssapi('')
l.sasl_interactive_bind_s('', auth_tokens)
l.add_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [('gecos', ['something'])])
这将返回此错误:
ldap.OBJECT_CLASS_VIOLATION: {'info': '0000207B: UpdErr: DSID-0305124B, problem 6002 (OBJ_CLASS_VIOLATION), data 0n', 'desc': 'Object class violation'}
不过,如果我在 ADUC 中提前创建属性,此命令是成功的:
l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(1, 'gecos', None), (0, 'gecos', ['something'])])
add命令确实适用于ldapmodify:
> ldapmodify -x -h TEST.DOM.DE -D Administrator@TEST.DOM.DE
dn:CN=dmulder,CN=Users,DC=test,DC=dom,DC=de
changetype: modify
add: gecos
gecos: something
modifying entry "CN=dmulder,CN=Users,DC=test,DC=dom,DC=de"
知道我在这里做错了什么吗?
l.add_s
用于添加对象,而不是属性。
在这种情况下,您正在尝试创建新对象,并且缺少创建对象所需的多个属性。你应该使用
l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(0, 'gecos', 'something')])
只向对象添加新属性。
澄清一下: 如果尚未设置该属性,则此语法错误:l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(1, 'gidNumber', None), (0, 'gidNumber', ['1000'])])
上面的语法(没有以前的值(是正确的。
我按照指南在ubuntu 16中安装了OpenLDAP服务器守护进程,下面是我的尝试。
import ldap
l = ldap.initialize('ldap://localhost',trace_level=3)
l.simple_bind_s('CN=admin,DC=example,DC=com','381138')#my setting
base_dn = 'DC=example,DC=com'
filter = '(objectclass=person)'
attrs = ['gecos']
add_record = [
('objectclass', ['inetOrgPerson']),
('gecos', ['Bacon'] ),
]
#l.modify_s('CN=dmulder,ou=people,dc=example,dc=com', [(1, 'gecos', None), (0, 'gecos', ['something'])])
l.add_s('cn=dmulder,ou=people,dc=example,dc=com', add_record)
l.search_s( base_dn, ldap.SCOPE_SUBTREE, filter, attrs )
如果你没有违反模式,那么它一定是ldapclient.python-lap的一个错误只是一个包装器。
例如,如果未在属性中指定结构对象类,则会引发 OTHER 异常。如果记录不包含 UID 中使用的属性,则会引发NAMING_VIOLATION。如果记录缺少结构对象类所需的属性,则会引发OBJECT_CLASS_VIOLATION,依此类推。
请使用 python-ldapt 系列提供的dump_record.py
转储新条目来查找遗漏的内容。