2017-09-13 44 views

回答

0

你必须使用Active Directory上的扩展搜索操作,它允许您注册当发生变化的通知。

这是微软AD这样做提供的OID:

https://msdn.microsoft.com/en-us/library/aa366983(v=vs.85).aspx

在UnboundID LDAP SDK而言,似乎这种控制应该做的事情,你需要成为这个控制(但不一个Java专家):

https://docs.ldap.com/ldap-sdk/docs/javadoc/com/unboundid/ldap/sdk/experimental/ActiveDirectoryDirSyncControl.html

+1

DirSync控件是一个LDAP控件(OID 1.2.840.113556.1.4.841),因此它不同于第一个链接中引用的控件;但是对于期望的结果可能是一个不错的选择。 AFIK,UnboundID LDAP SDK不直接支持LDAP_SERVER_NOTIFICATION_OID(1.2.840.113556.1.4.528),但应该是相当直接的实现。 – jwilleke

+0

@jwilleke感谢您指出。我不是Java专家,因此只是通过好奇心检查UnboundID文档而无需进一步搜索。我会编辑我的答案以包含您的观点。 – Esteban

+0

感谢您的回答。不需要主动直接调节?当我更改条目的任何属性时,不会调用侦听器的方法(根据UnboundID LDAP SDK)。我尝试使用自定义控件(代码与PersistentSearchRequestControl相同),但使用其他oid(1.2.840.113556.1.4.528)。不幸的是,不能安装dirSync。 – nikelyn

0

基础上提出的意见,LDAP_SERVER_NOTIFICATION_OID控制执行应当AD工作。看到这个非常基本的测试例子:

// LDAP_SERVER_NOTIFICATION_OID (1.2.840.113556.1.4.528) 
@Test 
public void test_LDAP_SERVER_NOTIFICATION_OID() throws LDAPException, InterruptedException 
{ 
    AsyncSearchResultListener myAsyncSearchResultListener = new MyLdapChangeAsyncListener(); 

    SearchRequest searchRequest = new SearchRequest(
      myAsyncSearchResultListener, 
      "DC=test,DC=lab,DC=com", // baseDN 
      SearchScope.SUB, 
      Filter.createPresenceFilter("objectClass"), null); 

    Control myControl = new Control("1.2.840.113556.1.4.528"); 
    searchRequest.addControl(myControl); 

    AsyncRequestID asyncSearchId = connection.asyncSearch(searchRequest); 

    // Wait 15 seconds for changes to be returned 
    Thread.sleep(15000); 

    connection.abandon(asyncSearchId); 
    connection.close(); 

} 


private class MyLdapChangeAsyncListener implements AsyncSearchResultListener 
{ 
    @Override 
    public void searchEntryReturned(SearchResultEntry searchEntry) 
    { 
     System.out.println(" >>> ldap searchEntryReturned: " + searchEntry); 
    } 

    @Override 
    public void searchReferenceReturned(SearchResultReference searchReference) 
    { 
     System.out.println(" >>> ldap searchReferenceReturned: " + searchReference); 
    } 

    @Override 
    public void searchResultReceived(AsyncRequestID requestID, SearchResult searchResult) 
    { 
     System.out.println(" >>> ldap searchResultReceived: " + requestID + "/" + searchResult); 
    } 

} 

该测试没有太大的作用。同时等待15秒钟,同时打印出baseDN内的任何更改。