para - python ldap exceptions
python-ldap add_s no puede agregar el atributo para el usuario AD con OBJECT_CLASS_VIOLATION (2)
Sigo la guía e instalo el daemon del servidor OpenLDAP en ubuntu 16.y a continuación estoy en mi intento.
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 )
Si no viola el esquema, debe ser un error de ldapclient.python-ldap solo un contenedor.
Por ejemplo, si no se especifica una clase de objeto estructural en los atributos, se generará una excepción OTHER. Si un registro no contiene los atributos utilizados en el UID, se generará NAMING_VIOLATION. Si a un registro le falta un atributo requerido por una clase de objeto estructural, se generará OBJECT_CLASS_VIOLATION, y así sucesivamente.
Utilice dump_record.py
provisto por una serie de python-ldap para volcar la nueva entrada y encontrar lo que falta.
Obtengo OBJECT_CLASS_VIOLATION cuando trato de agregar un atributo. Modificar un atributo existente funciona bien (incluso este mismo atributo, si lo agrego desde AD primero, luego mod).
Primero, como administrador de dominio, luego:
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''])])
Lo cual devuelve este error:
ldap.OBJECT_CLASS_VIOLATION: {''info'': ''0000207B: UpdErr: DSID-0305124B, problem 6002 (OBJ_CLASS_VIOLATION), data 0/n'', ''desc'': ''Object class violation''}
Sin embargo, este comando es exitoso, si creo el atributo antes de tiempo dentro de ADUC:
l.modify_s(''CN=dmulder,CN=Users,DC=test,DC=dom,DC=de'', [(1, ''gecos'', None), (0, ''gecos'', [''something''])])
Y el comando add funciona con ldapmodify:
> ldapmodify -x -h TEST.DOM.DE -D [email protected]
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"
¿Alguna idea de lo que estoy haciendo mal aquí?
l.add_s
se usa para agregar un objeto, no un atributo.
En este caso, está intentando crear un nuevo objeto y le faltan varios atributos necesarios para la creación de objetos. Deberías estar usando
l.modify_s(''CN=dmulder,CN=Users,DC=test,DC=dom,DC=de'', [(0, ''gecos'', ''something'')])
simplemente agregar un nuevo atributo al objeto.
Para aclarar: cuando el atributo no está ya configurado, esta sintaxis es incorrecta: l.modify_s(''CN=dmulder,CN=Users,DC=test,DC=dom,DC=de'', [(1, ''gidNumber'', None), (0, ''gidNumber'', [''1000''])])
La sintaxis anterior (sin un valor previo) es correcta.