2017-08-10 1 views
9

J'obtiens une OBJECT_CLASS_VIOLATION lorsque j'essaie d'ajouter un attribut. La modification d'un attribut existant fonctionne très bien (même ce même attribut, si je l'ajoute d'abord en AD, puis le modifie).python-ldap add_s ne parvient pas à ajouter un attribut pour l'utilisateur AD avec OBJECT_CLASS_VIOLATION

D'abord, je Kinit en tant qu'administrateur de domaine, puis:

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

qui renvoie cette erreur:

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

Cette commande réussit bien, si je crée l'attribut à l'avance dans les ADUC:

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

Et la commande add fonctionne avec 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" 

Une idée de ce que je fais mal ici?

+0

Le schéma autorise les attributs rfc2307. Evidemment, puisque ldapmodify * est * capable d'effectuer un ajout, seul le module python ne fait pas la même chose – David

+1

mon exception est'ldap.OBJECT_CLASS_VIOLATION: {'info': 'aucun attribut objectClass', 'desc': 'Classe d'objet violation '} ', et peut corriger en ajoutant objectClass.i suis sur ubuntu16, tous les paquets sont installés par apt. – obgnaw

+0

@obgnaw pourriez-vous expliquer ce que vous voulez dire? Y compris l'attribut objectClass dans l'opération add_s() ne fait rien pour moi. Si vous avez trouvé une solution, affichez les détails dans une réponse. – David

Répondre

2

l.add_s est utilisé pour ajouter un objet, pas un attribut.

Dans ce cas, vous tentez de créer un nouvel objet et il vous manque plusieurs attributs requis pour la création d'objet. Vous devriez être en utilisant

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

juste ajouter un nouvel attribut à l'objet.

Pour clarifier: Lorsque l'attribut n'est pas déjà, cette syntaxe est erronée: l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(1, 'gidNumber', None), (0, 'gidNumber', ['1000'])]) La syntaxe ci-dessus (sans valeur précédente) est correcte.

+0

Ah, j'avais essayé un modify, qui a échoué avec une erreur ldap.NO_SUCH_ATTRIBUTE. Maintenant je vois pourquoi. Je fournissais une valeur précédente (quoique vide), ce qui n'était pas correct. – David

1

Je suis guide et installe le démon du serveur OpenLDAP dans Ubuntu 16.et ci-dessous est ma tentative.

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 vous n'êtes pas violez le schéma, alors il doit y avoir un bug de ldapclient.python-ldap juste un emballage.

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.

S'il vous plaît utiliser le dump_record.py fourni par a series of python-ldap pour vider la nouvelle entrée pour trouver ce qui est manque.

+0

Cela ne fait pas de différence. En outre, j'utilise Active Directory, pas OpenLDAP. – David