OpenLDAPとActive Directoryを一緒に同期しようとしています。そのために、私はLSC-Projectと呼ばれるプログラムを使用しています。このプログラムは、このようなことを行うように指定されています。
私はできる限りプログラムを構成しましたが、次のエラーを振り払う方法が見つかりません。
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
これは、プログラムが実行される構成ファイルです。
###############################
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])
ソース構成の一部にあるタスク構成のbaseDnと関係があるのではないかと思います。
OSはubuntu 10.04とWindows2K3です
誰かが手動で同期することを提案しましたが、そのためのガイドは見つかりませんでした。そして、このプログラムは、費用なしでこの種の仕事をするということを言っているほとんど唯一のものです。
NameNotFoundException
の主な理由は、検索しているオブジェクト存在しないまたは検索しているコンテナが正しくありません。
baseDn
は、検索のベースオブジェクトの識別名である必要があります。たとえば、ou=users,dc=domname,dc=com
。
Spring-ldapの場合、baseDnをコンテキストファイル(LdapContextSource Bean)で指定し、userDnをビルドするためにcreateUserコードでこのエラーを取得するために使用していました。buildUserDn()
でdcを再度指定する必要はありません。
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;
}
Active Directoryの場合:Users
カタログはcontainer
クラスであり、OrganizationalUnitではありません。したがって、次を使用する必要があります:cn=users,dc=domname,dc=com