【问题标题】:python-ldap add_s fails to add attribute for AD user with OBJECT_CLASS_VIOLATIONpython-ldap add_s 无法为带有 OBJECT_CLASS_VIOLATION 的 AD 用户添加属性
【发布时间】:2017-08-10 19:12:21
【问题描述】:

我在尝试添加属性时收到 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 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'])])

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"

知道我在这里做错了什么吗?

【问题讨论】:

  • 架构允许 rfc2307 属性。显然,由于 ldapmodify 能够执行添加,只有 python 模块无法执行相同的操作
  • 我的例外是ldap.OBJECT_CLASS_VIOLATION: {'info': 'no objectClass attribute', 'desc': 'Object class violation'},可以通过添加objectClass来修复。我在ubuntu16上,所有的包都是apt安装的。
  • @obgnaw 你能解释一下你的意思吗?在 add_s() 操作中包含 objectClass 属性对我没有任何作用。如果您找到了解决方案,请在答案中发布详细信息。
  • Server 2008 和Server 2003 的用户等级不同,请发布您的系统版本。
  • 我使用的是 Server 2008

标签: python active-directory python-ldap


【解决方案1】:

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

【讨论】:

  • 啊,我尝试过修改,但由于 ldap.NO_SUCH_ATTRIBUTE 错误而失败。现在我明白为什么了。我提供了一个先前的值(尽管是空的),这是不正确的。
【解决方案2】:

我关注 guide 并在 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-ldap 只是一个包装器的错误。

例如,如果没有在属性中指定结构对象类,则会引发 OTHER 异常。如果记录不包含 UID 中使用的属性,则会引发 NAMING_VIOLATION。如果记录缺少结构对象类所需的属性,则会引发 OBJECT_CLASS_VIOLATION,依此类推。

请使用dump_record.pyprovided bya series of python-ldap转储新条目以查找遗漏的内容。

【讨论】:

  • 这没什么区别。另外,我使用的是 Active Directory,而不是 OpenLDAP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多