2017-09-13 101 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內的任何更改。