2017-06-12 33 views
0

嗨下面的LDAP查詢返回特定組中的成員「givenName」的列表。但是,我會返回特定組中成員的「sAMAccountName」列表。我對LDAP不太瞭解,並且不確定如何完成此操作。任何幫助表示讚賞。查詢活動目錄使用Java for samaccountname's綁定到特定組

public LdapContext getLdapContext(){ 
     LdapContext ctx = null; 
     String connection = null; 
     try{ 
      Hashtable<String, String> env = new Hashtable<String, String>(); 
      env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory"); 
      env.put(Context.SECURITY_AUTHENTICATION, "Simple"); 
      env.put(Context.SECURITY_PRINCIPAL, "userPrincipalName"); 
      env.put(Context.SECURITY_CREDENTIALS, "Password"); 
      env.put(Context.PROVIDER_URL, "domainController"); 
      ctx = new InitialLdapContext(env, null); 
      connection = "Connection Successful."; 
     }catch(NamingException nex){ 
      connection = "LDAP Connection: FAILED"; 
      nex.printStackTrace(); 
     } 
     this.getUserBasicAttributes("(&(objectClass=group)(CN=Users_Group))", ctx); 
     return ctx; 
    } 

    private void getUserBasicAttributes(String groupID, LdapContext ctx) { 
     try { 
      String userName = null; 
      String member = null; 

      SearchControls constraints = new SearchControls(); 
      constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      String[] attrIDs = {"member"}; 
      constraints.setReturningAttributes(attrIDs); 
      NamingEnumeration answer = ctx.search("DC=Domain,DC=com", groupID, constraints); 
      if (answer.hasMore()) { 
       Attributes attrs = ((SearchResult) answer.next()).getAttributes(); 
       member = attrs.get("member").toString(); 
      }else{ 
       throw new Exception("Invalid Group"); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return; 
    } 

上面的查詢結果類似於下:

member: CN=FistName 
LastName,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData, 
CN=FistName2 
LastName2,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData, 
CN=FistName3 
LastName3,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData, 
CN=FistName4 
LastName4,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData 
+0

您好,這可能對您的研究有用:https://stackoverflow.com/questions/508014/active-directory-ldap-query-by-samaccountname-and-domain –

回答

0

既然你引用「的samAccountName」,因此,假設你使用的是Microsoft Active Directory,您可以使用過濾器(LDAP_MATCHING_RULE_IN_CHAIN)爲:

(&(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=CN=GroupOne,OU=Security Groups,OU=Groups,DC=YOURDOMAIN,DC=NET) 

,並返回「的samAccountName」爲屬性。 -jim

+0

要實施這個解決方案,他必須知道該組的確切'dn',並且將不能夠搜索該目錄中具有'cn = Users_Group'的任何組,如代碼所暗示的那樣(只是指出它是否意圖行爲) – Esteban

+0

搜索一個羣組要比循環大概100或1000個成員更簡單,更高效;對? – jwilleke

+0

我不知道AD足夠了。如果memberOf屬性被索引,那麼你是對的,如果不是,則取決於用戶數量,組數,這種請求的頻率,具有cn = Users_Group'匹配的組數。但是我指出的是,事實上,無論出於何種原因,「dn」組在事發前都無法知曉。因此,搜索所有需要的組,並且使用多個'memberOf = groupdn'和邏輯'OR'來製作一個大型過濾器也可能代價高昂。這只是一個評論,關於什麼代碼建議 – Esteban

0

您粘貼的代碼,你粘貼不檢索成員givenName屬性的輸出。它只檢索cn=Users_Group組的成員dn

您的用戶的dn由用戶的cn屬性組成,因此您看到的原因爲CN=FistName LastName,OU=ouData,OU=ouData,OU=ouData,DC=dcData,DC=dcData,DC=dcData

要檢索這些用戶現在通過這些dn必須循環的samAccountName和檢索每個對應dn條目的samAccountName屬性。