【问题标题】:How to get all dn in my ldapsearch in JAVA如何在 JAVA 中获取我的 ldapsearch 中的所有 dn
【发布时间】:2017-01-26 05:15:04
【问题描述】:

在 Linux Shell 中,我使用以下命令获取 LDAP 中的所有专有名称 (DN):

ldapsearch -x -b "" -H URL -D uid=administrator,cn=admins,cn=city  -w PASS |grep dn:

我的问题:如何像使用上述命令一样在 Java 中获取所有 DN?

【问题讨论】:

  • 您阅读了 Java ProcessBuilder 以直接在 JVM 中运行该命令。如果那是你所要求的。
  • 谢谢,但我想要另一种方式!!!
  • 我和我希望你们这些新手最初明白我们不是。我们无法知道您想要什么,因为您没有提供有关您的想法的任何细节。
  • 我想将我的 ldap 服务器中的 anything 复制到另一个 ldap 服务器,所以我知道用户 dn,但我不知道另一个 dn。例如,我在源 ldap 中看到 dn 是 dn cn=config 所以我想在我的 ldap 中使用 java 代码中的任何 dn 并尊重我添加到目标 ldap 服务器的 dn

标签: java linux ldap dn


【解决方案1】:

您可以使用Java Naming and Directory Interface (JNDI)

这是一个受链接教程启发的示例:

import javax.naming.*;
import javax.naming.directory.*;
import java.util.Hashtable;

/**
 * Retrieves the DN from the search results
 */
class FullName {
  public static void printSearchEnumeration(NamingEnumeration retEnum) {
    try {
      while (retEnum.hasMore()) {
        SearchResult sr = (SearchResult) retEnum.next();
        System.out.println(">>" + sr.getNameInNamespace());
      }
    } 
    catch (NamingException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    // Set up the environment for creating the initial context
    Hashtable<String, Object> env = new Hashtable<String, Object>(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

    env.put(Context.PROVIDER_URL, "ldap://localhost:389");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "uid=administrator,cn=admins,cn=city");
    env.put(Context.SECURITY_CREDENTIALS, "PASS");

    // Perform search in the entire subtree.
    SearchControls ctl = new SearchControls();
    ctl.setSearchScope(SearchControls.SUBTREE_SCOPE);

    try {
      // Create initial context
      DirContext ctx = new InitialDirContext(env);

      NamingEnumeration answer = ctx.search("", null, ctl);

      // Print the answer
      printSearchEnumeration(answer);

      // Close the context when we're done
      ctx.close();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

【讨论】:

  • 我已经使用了这段代码,java给了我这个错误:javax.naming.NameNotFoundException: [LDAP: error code 32 - No such Object];剩下的名字“ou=People”
  • 那是另一个问题,我建议你用代码和堆栈跟踪发布一个与此问题相关的问题,我会看看。谢谢
  • 好的,我会做的
  • @SaeidRasouli,实际上我更新了我的答案以指定范围并清除了搜索上下文,因为您没有提到 ou=People 但根据您的环境属性,您可能必须设置一个 basedn(域组件)以防止出现 NameNotFoundException。
  • 非常感谢:-)) 我使用 "(&(objectClass=*))" 作为第二个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
相关资源
最近更新 更多