J'essaie de synchroniser OpenLDAP et Active Directory ensemble. Pour ce faire, j'utilise un programme appelé LSC-Project, conçu pour faire ce genre de chose.
J'ai configuré le programme le mieux possible, mais je ne trouve pas le moyen de dissiper l'erreur suivante:
javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-
031001CD,
problem 2001 (NO_OBJECT), data 0, best match of:
'DC=domname,DC=com'
]; remaining name
'uid=user1,ou=Users'
May 09 15:19:25 - ERROR - Error while synchronizing ID uid=user1,ou=Users:
Java.lang.Exception:
Technical problem while applying modifications to directory
dn: uid=user1,ou=Users,dc=domname,dc=com
changetype: add
userPassword: 3+kU2th/WMo/v553A24a3SBw2kU=
objectClass: uid
Voici le fichier de configuration sur lequel le programme est exécuté:
###############################
Destination LDAP directory #
##############################
dst.Java.naming.provider.url = ldap://192.168.1.3:389/dc=Windows,dc=com
dst.Java.naming.security.authentication = simple
dst.Java.naming.security.principal = cn=Administrator,cn=Users,dc=Windows,dc=com
dst.Java.naming.security.credentials = 11111
dst.Java.naming.referral = ignore
dst.Java.naming.ldap.derefAliases = never
dst.Java.naming.factory.initial = com.Sun.jndi.ldap.LdapCtxFactory
dst.Java.naming.ldap.version = 3
dst.Java.naming.ldap.pageSize = 1000
#########################
Source LDAP directory
#########################
src.Java.naming.provider.url = ldap://192.168.1.2:389/dc=Linux,dc=com
src.Java.naming.security.authentication = simple
src.Java.naming.security.principal = uid=root,ou=users,dc=Linux,dc=com
src.Java.naming.security.credentials = 11111
src.Java.naming.referral = ignore
src.Java.naming.ldap.derefAliases = never
src.Java.naming.factory.initial = com.Sun.jndi.ldap.LdapCtxFactory
src.Java.naming.ldap.version = 3
#######################
Tasks configuration
#######################
lsc.tasks = Administrator
lsc.tasks.Administrator.srcService = org.lsc.jndi.SimpleJndiSrcService
lsc.tasks.Administrator.srcService.baseDn = ou=users
lsc.tasks.Administrator.srcService.filterAll = (&(objectClass=person))
lsc.tasks.Administrator.srcService.pivotAttrs = uid
lsc.tasks.Administrator.srcService.filterId = (&(objectClass=person)(uid={uid}))
lsc.tasks.Administrator.srcService.attrs = description uid userPassword
lsc.tasks.Administrator.dstService = org.lsc.jndi.SimpleJndiDstService
lsc.tasks.Administrator.dstService.baseDn = cn=Users
lsc.tasks.Administrator.dstService.filterAll = (&(cn=*)(objectClass=organizationalPerson))
lsc.tasks.Administrator.dstService.pivotAttrs = cn, top, person, user, organizationalPerson
lsc.tasks.Administrator.dstService.filterId = (&(objectClass=user) (sAMAccountName={cn}))
lsc.tasks.Administrator.dstService.attrs = description cn userPassword objectClass
lsc.tasks.Administrator.bean = org.lsc.beans.SimpleBean
lsc.tasks.Administrator.dn = "uid=" + srcBean.getAttributeValueById("uid") + ",ou=Users"
dn.real_root = dc=Domname,dc=com
#############################
Syncoptions configuration
#############################
lsc.syncoptions.Administrator = org.lsc.beans.syncoptions.PropertiesBasedSyncOptions
lsc.syncoptions.Administrator.default.action = M
lsc.syncoptions.Administrator.objectClass.action = M
lsc.syncoptions.Administrator.objectClass.force_value = srcBean.getAttributeValueById("cn").toUpperCase()
lsc.syncoptions.Administrator.userPassword.default_value = SecurityUtils.hash(SecurityUtils.HASH_SHA1, "defaultPassword")
lsc.syncoptions.Administrator.default.delimiter=;
lsc.syncoptions.Administrator.objectClass.force_value = "top";"user";"person";"organizationalPerson"
lsc.syncoptions.Administrator.userPrincipalName.force_value = srcBean.getAttributeValueById("uid") + "@Domname.com"
lsc.syncoptions.Administrator.userAccountControl.create_value = AD.userAccountControlSet ( "0", [AD.UAC_SET_NORMAL_ACCOUNT])
Je soupçonne que cela a quelque chose à voir avec le baseDn de la configuration de la tâche dans la partie de la configuration source.
Les systèmes d'exploitation sont Ubuntu 10.04 et Windows2K3
Quelqu'un m'a suggéré de faire une synchronisation manuelle entre eux mais je n'ai trouvé aucun guide pour le faire. Et ce programme est à peu près la seule chose qui dit que fait ce genre de travail sans coûts.
La raison principale pour NameNotFoundException
est que l'objet que vous recherchez n'existe pas ou le conteneur dans lequel vous recherchez est non correct .
baseDn
doit être le nom distinctif de l'objet de base de la recherche, par exemple, ou=users,dc=domname,dc=com
.
Dans le cas de Spring-ldap, nous obtenions cette erreur lorsque nous spécifions le baseDn dans le fichier de contexte (bean LdapContextSource) ainsi que dans le code createUser pour générer userDn. Nous n'avons pas besoin de spécifier à nouveau le dc dans le buildUserDn()
protected Name buildUserDn(String userName) {
DistinguishedName dn = new DistinguishedName();
//only cn is required as the base dn is already specified in context file
dn.add("cn", userName);
return dn;
}
Dans Active Directory: le catalogue Users
est une classe container
, et non pas OrganizationalUnit. Vous devez donc utiliser: cn=users,dc=domname,dc=com