python-ldap add_s 无法为具有 OBJECT_CLASS_VIOLATION 的 AD 用户添加属性

python-ldap add_s fails to add attribute for AD user with OBJECT_CLASS_VIOLATION

我在尝试添加属性时收到 OBJECT_CLASS_VIOLATION。修改现有属性就可以正常工作(即使是同一个属性,如果我先从 AD 添加它,然后 mod 它)。

首先我以域管理员的身份 kinit,然后:

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'])])

其中returns这个错误:

ldap.OBJECT_CLASS_VIOLATION: {'info': '0000207B: UpdErr: DSID-0305124B, problem 6002 (OBJ_CLASS_VIOLATION), data 0\n', 'desc': 'Object class violation'}

不过,如果我在 ADUC 中提前创建属性,则此命令会成功:

l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(1, 'gecos', None), (0, 'gecos', ['something'])])

并且添加命令确实适用于 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"

知道我做错了什么吗?

我按照guide在ubuntu安装了OpenLDAP服务器守护进程16.and下面是我的尝试。

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-ldap 只是一个包装器的错误。

For example, if no structural object class is specified in the attributes, an OTHER exception will be raised. If a record does not contain the attributes used in the UID, a NAMING_VIOLATION will be raised. If a record is missing an attribute required by a structural object class, an OBJECT_CLASS_VIOLATION will be raised, and so on.

请使用dump_record.py提供的a series of python-ldap转储新条目以查找未命中的内容。

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'])]) 上面的语法(没有前一个值)是正确的。