在Windows服务器上查询到LDAP以获取Active Directory的用户

时间:2018-10-18 04:32:53

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

我已经在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

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:1)

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

SECURITY_PRINCIPAL有三个选项,因为Active Directory的LDAP实现使您可以与userPrincipalName( dsquery用户-o upn -name ecode ),sAMAccountName(domain \ logonID)绑定但是 dsquery用户-o samid -name ecode 出于某种原因仅返回sAMAccountName的logonID组件,或完全限定的DN( dsquery用户-o dn-名称ecode )。

如果您确认所使用的ID与以下之一匹配,请查看错误的密码计数是否在增加。错误的密码计数不是复制的属性;如果您有多个域控制器,请以LDAP连接中使用的一个为目标。如果计数器在增加,则说明您具有正确的security_principal且密码被拒绝(密码错误或帐户可能已锁定)

df['Address'] = df[addColumns].fillna('').astype(str).apply(lambda x: ', '.join([i for i in x if i]), axis=1)