python-ldap add_s无法使用OBJECT_CLASS_VIOLATION为AD用户添加属性

Dav*_*der 10 python active-directory python-ldap

尝试添加属性时,我得到一个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'])])
Run Code Online (Sandbox Code Playgroud)

哪个返回此错误:

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

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

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

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"
Run Code Online (Sandbox Code Playgroud)

知道我在这里做错了吗?

小智 6

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