java - Active Directory - 通过指定搜索过滤器和搜索控件进行搜索,无需上下文

标签 java active-directory ldap

我关注了this在 Activity 目录中搜索的教程。

示例代码:

class SearchSubtree {
  public static void main(String[] args) {

    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/o=JNDITutorial");

    try {
      DirContext ctx = new InitialDirContext(env);

      String[] attrIDs = { "sn", "telephonenumber", "golfhandicap", "mail" };
      SearchControls ctls = new SearchControls();
      ctls.setReturningAttributes(attrIDs);
      ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

      String filter = "(&(sn=Geisel)(mail=*))";

      NamingEnumeration answer = ctx.search("", filter, ctls);

      // Print the answer
      ctx.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

但是NameNotFoundException被抛出

NamingEnumerationanswer = ctx.search("",filter,ctls);

但是当我通过 "DC=extldap,DC=com" 作为第一个参数时,代码工作正常。

教程有问题吗?第一个参数不能为空字符串吗?或者这是 Active Directory 的限制?

最佳答案

一般来说,对于 LDAP 服务器,您始终需要一个根上下文来开始搜索。基本上,您所做的相当于尝试在不指定数据库或表名称的情况下搜索 SQL 数据库。

某些服务器实现可能允许空上下文(我知道 iPlanet 在某些情况下曾经允许它),但这些是规则的异常(exception)。

DirContext.search() 的 javadoc说:

Searches in the named context or object for entries that satisfy the given search filter. Performs the search as specified by the search controls.

See search(Name, String, SearchControls) for details.

Parameters:

  • name the name of the context or object to search

...

通常,在 Active Directory 中,可以从域根开始搜索,该根始终为 DC=<your>,DC=<domain> 。 这就是您的第二次搜索有效的原因。

关于java - Active Directory - 通过指定搜索过滤器和搜索控件进行搜索,无需上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34139297/

相关文章:

linux - 包含 ldapmodify 的 shell 脚本 - 硬编码命令

java - 获取 Active Directory 中具有特殊字符的组名称的组属性

java - OpenLDAP LDAPConnection.bind() dn 字符串中可以使用通配符吗?

java - LinkedIn - 了解用户 api 访问与服务器 api 访问

java - 获取参数化类型的 java.lang.Class<T> 对象而不构造 q_uestion 中的类?

java - 将 java 连接到 Active-Directory - 错误 49 数据 5

c# - PermissiveModifyControl 在 C# LDAP 中抛出 DirectoryOperationException

objective-c - LDAP 身份验证,ldap_sasl_bind_s 不工作但 ldap_simple_bind_s 工作

java - Instanceof 和类型转换技术

java - 在 Eclipse 中从 Java 访问 Scala 实例变量