2013-10-09 35 views
3

我試圖運行:Active Directory中不支持NamingListener?

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];其餘名稱爲' 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) 在com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:129)

我也跑這個代碼,我發現here一個本應驗證我的AD支持持續搜索,並且結果是真實的。

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獲取活動?

回答

1

更新: 我發現這個:https://forums.oracle.com/thread/1157474?tstart=0 它基本上說,AD不支持這一點,並且我不能使上述代碼工作。 然而,它確實給了2種不同的AD得到這樣的通知方式:

  1. 使用DirSync-我試圖連接的代碼,並沒有工作,但沒有繼續從將要上市的原因調查在這篇文章的結尾。
  2. 使用LDAP通知(https://forums.oracle.com/message/4698114) - 此代碼工作,但是,它只返回創建/更改事件的結果,它不會在一個對象被刪除時通知,並且無法通過此方法獲取它,因爲搜索過濾器無法更改,因爲任何其他過濾器都不起作用。所以它不符合我的目的,但也許別人覺得它有用。

我認爲DirSync可能是我唯一可能的解決方案,如果有的話。 然而,應該指出的是,目錄同步有以下限制:

  • 目錄同步控制只能由一個高特權帳戶使用,諸如域管理員。
  • DirSync控件只能監視整個命名上下文。您無法將DirSync搜索的範圍限制爲只監視命名上下文中的特定子樹,容器或對象。

我希望這些信息能幫助未來的其他人。

+0

我不能將它張貼在我的答案,但是從這個頁面中採取目錄同步的侷限性:http://msdn.microsoft.com/en-us/library/窗戶/桌面/ ms677625(v = vs.85)的.aspx – jasmine100

1

根據documentation,範圍不能爲Subtree,並且搜索過濾器必須爲(objectClass=*)才能進行持久性搜索。

0

我想補充一些關於這個話題的信息,因爲幾年前我已經完成了關於這個話題的研究。

JNDI提供的NamingListener功能。如果您嘗試在任何LDAP服務器上註冊NamingListener,該服務器必須支持'Persistent Search'擴展名。持久搜索擴展一直在IETF草案階段,因此沒有官方的RFC#與它關聯。

並不是很多LDAP服務器都支持這個擴展。我上次研究此主題的時間是2008年,支持持續搜索擴展的LDAP服務器是389 Directory Server,Oracle 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