代码之家  ›  专栏  ›  技术社区  ›  MyTwoCents

在windows服务器上查询ldap以获取active directory的用户

  •  0
  • MyTwoCents  · 技术社区  · 7 年前

    我已在Windows 2012服务器中设置了AD DS和AD LDS。

    需求是使用Java向LDAP查询。

    我试过这个:

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://55.22.44.22:53358");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    "CN=ecode,CN=Users,DC=ecode,DC=com");
    env.put(Context.SECURITY_PRINCIPAL, "ecode@ecode.com");
    env.put(Context.SECURITY_CREDENTIALS, "ddadadad");
    
    DirContext context = new InitialDirContext(env);
    

    我得到以下错误

    线程“main”javax.naming.authenticationexception中出现异常:[ldap:错误代码49-8009030c:ldaper:dsid-0c09042f,注释:AcceptSecurityContext错误,数据2030,V2580]
    在COM.Sun.jndi.LDAP.LDAPCTX.MaMeRoRCODE(LDAPCTX.java:3154)
    在COM.Sun.jndi.LDAP.LDAPCTX.PurrestRe转码(LDAPCTX.java:3100)
    在COM.Sun.jndi.LDAP.LDAPCTX.PurrestRe转码(LDAPCTX.java:2886)
    在COM.Sun.jndi.LDAP.LDAPCTX.Connect(LDAPCTX.java:2800) 在com.sun.jndi.ldap.ldapctx上。(ldapctx.java:319) 在COM.Sun.jndi.LDAP.LDAPCTXPrime.GETSUIGURL URL(LDAPCTXPrime.java:192) 在COM.Sun.jndi.LDAP.LDAPCTXPrime.GETUsIGURURL(LDAPCTXPrime.java:210) 在COM.Sun.jndi.LDAP.LDAPCTXPrime.GETLDAPCTXTebug(LDAPCTXPr.java:153) 在COM.Sun.jndi.LDAP.LDAPCTXPrime.GETIMALLATION上下文(LDAPCTXPrime.java:83)

    我知道代码49是 LDAP_INVALID_CREDENTIALS . 我不知道该送什么进去 SECURITY_AUTHENTICATION 参数。

    我试着跟随 安全认证 输入参数:

    CN=ecode,CN=Users,DC=ecode,DC=com
    ecode@ecode.com
    

    当我尝试的时候

    dsquery user -name ecode 
    

    我得到这个输出

    CN=ecode,CN=Users,DC=ecode,DC=com
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Gabriel Luci    7 年前

    我不是Java开发人员(至少不是最近),但根据 examples here ,你应该这样做:

    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "CN=ecode,CN=Users,DC=ecode,DC=com");
    env.put(Context.SECURITY_CREDENTIALS, "ddadadad");
    
        2
  •  1
  •   LisaJ    7 年前

    这基本上就是我在active directory和一些纯ldap服务器上成功使用的——第五行不正确;但是不应该编译不匹配的括号,所以我假设这是一个复制/粘贴问题,这一行实际上是用您尝试过的另一种登录ID格式的注释。

    安全主体有三个选项,因为active directory的ldap实现允许您使用userprincipalname绑定( dsquery user-o upn-name ecode ),sAMAccountName(域\logonID但是 dsquery user-o samid-name ecode 出于某种原因,只返回samaccountname的logonid组件,或者返回完全限定的dn( dsquery user-o dn-name ecode )

    如果已确认使用的ID与其中一个匹配,请查看错误密码计数是否正在递增。错误的密码计数不是复制属性;如果您有多个域控制器,请将LDAP连接中使用的域控制器作为目标。如果计数器正在递增,则您已获得正确的安全主体,密码将被拒绝(密码错误或可能是帐户被锁定)

    dsquery * "Fully-Qualified-DN-Here" -scope base -attr badPwdCount -s DomainControllerUsedInLDAPBind