2017-08-10 6 views
9

Otrzymuję OBJECT_CLASS_VIOLATION podczas próby dodania atrybutu. Modyfikowanie istniejącego atrybutu działa dobrze (nawet ten sam atrybut, jeśli najpierw dodaję go z AD, a potem go modyfikuję).Python-ldap add_s nie dodaje atrybutu dla użytkownika AD z OBJECT_CLASS_VIOLATION

Najpierw kinit jako administrator domeny, a następnie:

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

Które zwraca ten błąd:

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

To polecenie jest udany choć, jeśli utworzyć atrybut wyprzedzeniem ciągu ADuC:

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

a polecenie add działa z 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" 

Jakieś pojęcie, co robię źle tutaj?

+0

Schemat zezwala na atrybuty rfc2307. Oczywiście, ponieważ ldapmodify * jest * w stanie wykonać dodawanie, tylko moduł python nie robi tego samego – David

+1

mój wyjątek to 'old.OBJECT_CLASS_VIOLATION: {'info': 'no objectClass attribute', 'desc': 'Object class naruszenie}} i można naprawić przez dodanie obiektu objectClass.i na Ubuntu16, wszystkie pakiety są instalowane przez apt. – obgnaw

+0

@ bgnaw mógłbyś wyjaśnić co masz na myśli? Włączenie atrybutu objectClass w operacji add_s() nic dla mnie nie robi. Jeśli znalazłeś rozwiązanie, opublikuj szczegóły w odpowiedzi. – David

Odpowiedz

2

służy do dodawania obiektów, a nie atrybutów.

W tym przypadku próbujesz utworzyć nowy obiekt i brakuje wielu wymaganych atrybutów do utworzenia obiektu. Powinieneś używać

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

po prostu dodać nowy atrybut do obiektu.

Dla wyjaśnienia: Gdy atrybut nie jest już ustawiony, to składnia jest źle: l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(1, 'gidNumber', None), (0, 'gidNumber', ['1000'])]) Powyższa składnia (bez poprzedniej wartości) jest prawidłowa.

+0

Ah, próbowałem modyfikacji, która nie powiodła się z błędem ldap.NO_SUCH_ATTRIBUTE. Teraz rozumiem, dlaczego. Dostarczałem poprzednią wartość (aczkolwiek pustą), co nie było poprawne. – David

1

Podążam za guide i instaluję demona serwera OpenLDAP w Ubuntu 16. i poniżej moja próba.

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) 

jeśli nie naruszają schemat, to musi to być błąd z ldapclient.python-ldap tylko otoki.

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.

proszę użyć dostarczonego dump_record.py przez a series of python-ldap zrzucić nowy wpis, aby znaleźć to, co jest panna.

+0

Nie ma to znaczenia. Używam również usługi Active Directory, a nie OpenLDAP. – David

Powiązane problemy