4

私は実行しようとしています:

    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);

しかし、私のリスナーが受け取る最初のメッセージは次のとおりです。

javax.naming.OperationNotSupportedException: [LDAP: エラー コード 12 - 00000057: LdapErr: DSID-0C090753、コメント: コントロールの処理エラー、データ 0、v1db1]; 残りの名前 '' com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3127) com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3013) com.sun.jndi.ldap .LdapCtx.processReturnCode(LdapCtx.java:2820) at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:129)

また、AD が永続的な検索をサポートしていることを確認するためにここで見つけたこのコードを実行したところ、結果は 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;
}

AD からイベントを取得するにはどうすればよいですか?

4

3 に答える 3

1

documentationによると、スコープは指定できず、検索フィルターは永続検索用であるSubtree必要があります。(objectClass=*)

于 2013-10-12T01:57:32.437 に答える
0

数年前にこのトピックに関する調査を行ったので、このトピックに関する追加情報を追加したいと思います。

JNDI によって提供される NamingListener 機能。任意の LDAP サーバーに NamingListener を登録しようとする場合、特にそのサーバーは「永続検索」拡張機能をサポートしている必要があります。Persistent Search 拡張機能は、常に 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 に答える