【问题标题】:Query to LDAP on WIndows Server to get Active Directory's User在 WIndows Server 上查询 LDAP 以获取 Active Directory 的用户
【发布时间】:2019-03-22 20:28:41
【问题描述】:

我已经在 Windows 2012 Server 中设置了 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:LdapErr:DSID-0C09042F,注释:AcceptSecurityContext 错误,数据 2030,v2580�]
在 com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3154)
在 com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3100)
在 com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2886)
在 com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2800) 在 com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:319) 在 com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:192) 在 com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:210) 在 com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:153) 在 com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:83)

我知道代码 49 是 LDAP_INVALID_CREDENTIALS。我不确定要传入什么 SECURITY_AUTHENTICATION参数。

我已尝试在参数中以SECURITY_AUTHENTICATION 的形式关注:

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

当我尝试时在 Powershell 中

dsquery user -name ecode 

我得到这个输出

CN=ecode,CN=Users,DC=ecode,DC=com

【问题讨论】:

    标签: active-directory ldap windows-server-2012


    【解决方案1】:

    我不是 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】:

      这基本上是我成功地用于 Active Directory 以及一些纯 LDAP 服务器的方法——第五行是不对的;但是不匹配的括号不应该编译,所以我假设这是一个复制/粘贴问题,并且该行实际上是用您尝试过的另一种登录 ID 格式进行注释。

      SECURITY_PRINCIPAL 有三个选项,因为 Active Directory 的 LDAP 实现允许您绑定 userPrincipalName (dsquery user -o upn -name ecode)、sAMAccountName (domain\logonID但 dsquery user -o samid -name ecode 出于某种原因仅返回 sAMAccountName 的 logonID 组件)或完全限定的 DN(dsquery user -o dn -name ecode)。

      如果您已确认您使用的 ID 与其中之一匹配,请查看错误密码计数是否正在增加。错误密码计数不是复制属性;如果您有多个域控制器,请针对 LDAP 连接中使用的域控制器。如果计数器正在增加,那么您已经获得了正确的 security_principal 并且密码被拒绝(密码错误或可能是锁定的帐户)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        相关资源
        最近更新 更多