4

I'm trying to run:

    Map<String, String> environmentProperties = new HashMap<String, String>();
    environmentProperties.put("java.naming.security.authentication", "simple");
    environmentProperties.put("java.naming.ldap.attributes.binary", "tokenGroups objectSid");

    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setAnonymousReadOnly(false);
    contextSource.setPooled(false);

    contextSource.setUserDn("CN=Administrator,CN=Users,DC=someDomain,DC=com");
    contextSource.setPassword("password");

    contextSource.setUrls(new String[]{"ldap://url.goes.here"});
    contextSource.setBaseEnvironmentProperties(environmentProperties);
    contextSource.setDirObjectFactory(null);
    contextSource.afterPropertiesSet();

    final SearchControls searchControls = new SearchControls();
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    ContextExecutor contextExecutor = new ContextExecutor() {
       public Object executeWithContext(DirContext ctx) throws NamingException {
          EventDirContext ectx = (EventDirContext) ctx.lookup("CN=Users,,DC=someDomain,DC=com");
          ectx.addNamingListener("", "(cn=*)", searchControls, new LDAPChangeListener());
          return null;
       }
    };


    LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
    ldapTemplate.setIgnorePartialResultException(true);

    ldapTemplate.executeReadOnly(contextExecutor);

but, the first message my listener gets is:

javax.naming.OperationNotSupportedException: [LDAP: error code 12 - 00000057: LdapErr: DSID-0C090753, comment: Error processing control, data 0, v1db1 ]; remaining name '' at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3127) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3013) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2820) at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:129)

I also ran this code I found here that's supposed to verify that my AD supports persistent search, and the result was true.

static boolean isPersistentSearchSupported(LdapContext rootContext)
        throws NamingException {
    SearchResult rootDSE;
    NamingEnumeration searchResults;
    Attributes attrs;
    NamingEnumeration attrEnum;
    Attribute attr;
    NamingEnumeration values;
    String value;
    String[] attrNames = { "supportedControl" };
    SearchControls searchControls = new SearchControls();

    searchControls.setCountLimit(0); // 0 means no limit
    searchControls.setReturningAttributes(attrNames);
    searchControls.setSearchScope(SearchControls.OBJECT_SCOPE);

    // search for the rootDSE object
    searchResults = rootContext.search("", "(objectClass=*)",
            searchControls);

    while (searchResults.hasMore()) {
        rootDSE = (SearchResult) searchResults.next();

        attrs = rootDSE.getAttributes();
        attrEnum = attrs.getAll();
        while (attrEnum.hasMore()) {
            attr = (Attribute) attrEnum.next();
            values = attr.getAll();
            while (values.hasMore()) {
                value = (String) values.next();
                if (value.equals("1.2.840.113556.1.4.528"))
                    return true;
            }
        }
    }
    return false;
}

what do I need to do to start getting events from AD?

4

3 回答 3

1

根据文档,范围不能Subtree,搜索过滤器必须(objectClass=*)用于持久搜索。

于 2013-10-12T01:57:32.437 回答
1

更新:我发现了这个:https ://forums.oracle.com/thread/1157474?tstart=0 它基本上说 AD 不支持这一点,而且我无法使上述代码工作。但是,它确实给出了从 AD 获取此类通知的 2 种不同方式:

  1. 使用 DirSync - 我尝试了附加的代码,但它没有工作,但没有继续调查将在本文末尾列出的原因。
  2. 使用 LDAP 通知 ( https://forums.oracle.com/message/4698114 ) - 此代码有效,但是,它只返回创建/更改事件的结果,一旦对象被删除,它就不会通知,而且没有办法使用此方法获取它,因为无法更改搜索过滤器,因为任何其他过滤器都不起作用。所以它不符合我的目的,但也许其他人觉得它有用。

我认为 DirSync 可能是我唯一可能的解决方案,如果有的话。但是,应该注意 DirSync 有以下限制:

  • DirSync 控件只能由具有高度特权的帐户(例如域管理员)使用。
  • DirSync 控件只能监视整个命名上下文。您不能将 DirSync 搜索的范围限制为仅监视命名上下文中的特定子树、容器或对象。

我希望这些信息将在未来对其他人有所帮助。

于 2013-10-15T18:41:04.010 回答
0

我想添加一些关于这个主题的额外信息,因为我在几年前对这个主题进行了研究。

JNDI 提供的 NamingListener 能力。如果您尝试在任何 LDAP 服务器上注册 NamingListener,则该服务器必须支持“持久搜索”扩展。持久搜索扩展一直处于 IETF 草案阶段,因此没有与它相关的官方 RFC#。

没有很多 LDAP 服务器支持这个扩展。我上一次研究这个主题是 2008 年,支持持久搜索扩展的 LDAP 服务器是389 Directory ServerOracle Internet Directory (OID)和 OpenDS(现在称为OpenDJ)。

http://www-archive.mozilla.org/directory/ietf-docs/draft-smith-psearch-ldap-01.txt

http://www.redhat.com/archives/fedora-directory-users/2008-May/msg00120.html

于 2013-10-17T03:56:32.597 回答