天天看點

擷取AD域中的組織機關域使用者,并且對使用者大于1000個的進行分批讀取

package hz;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Hashtable;

import java.util.List;

import java.util.Map;

import javax.naming.Context;

import javax.naming.NamingEnumeration;

import javax.naming.NamingException;

import javax.naming.directory.Attribute;

import javax.naming.directory.Attributes;

import javax.naming.directory.SearchControls;

import javax.naming.directory.SearchResult;

import javax.naming.ldap.Control;

import javax.naming.ldap.InitialLdapContext;

import javax.naming.ldap.LdapContext;

import javax.naming.ldap.PagedResultsControl;

import javax.naming.ldap.PagedResultsResponseControl;

import net.devin.db.DbMapUtil;

public class AdUserSys {

  public AdUserSys() {

  }

 public List<Map<String,String>> getUnit(String host,String port,String adminName,String adminPassword,String ou,String dc,String dc_houzui){

    String company = "";

//    String host = "192.168.0.14"; // AD伺服器

//    String port = "389"; // 端口

    List<Map<String,String>> li=new ArrayList<Map<String, String>>();

    List<Map<String,String>> list=new ArrayList<Map<String, String>>();

    Map<String, String> namerow=new HashMap<String, String>();

    String url = new String("ldap://" + host + ":" + port);

    Hashtable HashEnv = new Hashtable();

//    String adminName = "shejiguanli\\administrator"; // 注意使用者名的寫法:domain\User 

//    String adminPassword = "abc123!"; // 密碼

    HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP通路安全級别

    HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User

    HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); // AD Password

    HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工廠類

    HashEnv.put(Context.PROVIDER_URL, url);

    //HashEnv.put(Context.BATCHSIZE, "2500");

    try{

      LdapContext ctx = new InitialLdapContext(HashEnv, null);

      // 域節點

      String OU=hz.dtable.util.ParseUtil.convert2Null(ou);

      String searchBase = "DC="+dc+",DC="+dc_houzui; 

      if(OU.length() >0){

       searchBase = "OU="+OU+",DC="+dc+",DC="+dc_houzui; 

      }

      // LDAP搜尋過濾器類

      String searchFilter = "objectClass=organizationalUnit";//擷取帳号

      // 搜尋控制器

      SearchControls searchCtls = new SearchControls(); // Create the

      // 建立搜尋控制器

      searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

      // 定制傳回屬性

      String[] returnedAtts = { "uSNCreated","name","instanceType","ou"};

      searchCtls.setReturningAttributes(returnedAtts); // 設定傳回屬性集

      // 根據設定的域節點、過濾器類和搜尋控制器搜尋LDAP得到結果

      //objectClass=organizationalUnit 擷取使用者機關

      NamingEnumeration answe1=ctx.search(searchBase, searchFilter, searchCtls);

      int totalResults = 0;

     //有字段(uSNCreated:這個字段是對象建立時系統自動配置設定的建立序列号,并且是無符整型)可用來做uid或gid , 這是對這個字段的描述以及别人的應用

      while(answe1.hasMoreElements()){

       SearchResult sr = (SearchResult) answe1.next();// 得到符合搜尋條件的DN

       String dn=sr.getName();

        Attributes Attrs = sr.getAttributes();// 得到符合條件的屬性集

        if (Attrs != null) {

         Map<String, String> row=new HashMap<String, String>();

           for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {

            Attribute Attr = (Attribute) ne.next();// 得到下一個屬性

            ///System.out.println(" AttributeID=屬性名:"+ Attr.getID().toString());

            // 讀取屬性值

            for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {

             company =e.next().toString();

                //System.out.println("AttributeValues=屬性值:" + company);

            }

             row.put(Attr.getID().toString(), company+"".trim());

            row.put("dn", dn);

         }

         namerow.put(dn+"".trim(), row.get("uSNCreated"));

           li.add(row);

        }

      }

      namerow.put("huizhisys","-1000");

      ctx.close();

      //System.out.println(namerow.toString());

      for(int i=0;i<li.size();i++){

       Map rows=li.get(i);

       String uSNCreated=DbMapUtil.getValue(rows, "uSNCreated", "0");

       String distinguishedName=DbMapUtil.getValue(rows, "distinguishedName", "");

       String dn=DbMapUtil.getValue(rows, "dn", ""); //如果DN等于空那麼預設為頂節點

       String name=DbMapUtil.getValue(rows, "name", ""); //如果DN等于空那麼預設為頂節點

       if(dn.length() ==0){

        rows.put("parentid", "0");

       }else{

        if(("OU="+name).equalsIgnoreCase(dn)){

         //System.out.println(namerow.get("huizhisys"));

         rows.put("parentid",namerow.get("huizhisys"));

        }else{

         dn=dn.replace("OU="+name+",", "");

         rows.put("parentid",namerow.get(dn));

        }

       }

      System.out.println(rows.toString());

       list.add(rows);

      }

     return list;

    }catch(Exception e){

     e.printStackTrace();

     return null;

    }

 }

  public List<Map<String,String>> getADInfo(String host,String port,String adminName,

    String adminPassword,String ou,String dc,String dc_houzui,Map<String,String> usermap) {

   String company = "";

   List<Map<String,String>> li=new ArrayList<Map<String, String>>();

   List<Map<String,String>> list=new ArrayList<Map<String, String>>();

   Map<String, String> namerow=new HashMap<String, String>();

   String url = new String("ldap://" + host + ":" + port);

   Hashtable HashEnv = new Hashtable();

   HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP通路安全級别

   HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User

   HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); // AD Password

   HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工廠類

   HashEnv.put(Context.PROVIDER_URL, url);

  // HashEnv.put(Context.BATCHSIZE, 2500+"");

   int pageSize=980;   //每次擷取多少條

   int total; //總共擷取的條數

   byte[] cookie = null;

   try {

    LdapContext ctx = new InitialLdapContext(HashEnv, null);

    ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, Control.CRITICAL) });//分頁讀取控制---因為LDAP 預設情況隻能讀取1000條資料

    // 域節點

    do{

    String OU=hz.dtable.util.ParseUtil.convert2Null(ou);

    String searchBase = "DC="+dc+",DC="+dc_houzui; 

    if(OU.length() >0){

     searchBase = "OU="+OU+",DC="+dc+",DC="+dc_houzui; 

    }

    // LDAP搜尋過濾器類

    //(&(|(objectclass=user)(objectclass=person)(objectclass=inetOrgPerson)(objectclass=organizationalPerson)))

    String searchFilter = "(&(objectclass=user)(sAMAccountName=*))";//擷取帳号

    // 搜尋控制器

    SearchControls searchCtls = new SearchControls(); // Create the

    // 建立搜尋控制器

    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    String[] returnedAtts = { "uSNCreated","name","userPrincipalName" };// 定制傳回屬性

    searchCtls.setReturningAttributes(returnedAtts); // 設定傳回屬性集

   // System.out.println(searchCtls.);

    // 根據設定的域節點、過濾器類和搜尋控制器搜尋LDAP得到結果

    int totalResults = 0;

    int rows = 0;

    NamingEnumeration answer =ctx.search(searchBase, searchFilter, searchCtls);

    // 初始化搜尋結果數為0

     while (null !=answer &&answer.hasMoreElements()) {// 周遊結果集

       SearchResult sr = (SearchResult) answer.next();// 得到符合搜尋條件的DN

       String dn = sr.getName();

      Attributes Attrs = sr.getAttributes();// 得到符合條件的屬性集

       if (Attrs != null) {

        Map<String, String> row=new HashMap<String, String>();

          for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {

           Attribute Attr = (Attribute) ne.next();// 得到下一個屬性

           // 讀取屬性值

           for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {

            company =  e.next().toString();

           }

           row.put(Attr.getID().toString(), company);

         }

          row.put("userdn", dn);

          //System.out.println(row.toString());

          li.add(row);

       }

     }

      Control[] controls = ctx.getResponseControls();

       if (controls != null) {

         for (int i = 0; i < controls.length; i++) {

           if (controls[i] instanceof PagedResultsResponseControl) {

             PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i];

             total = prrc.getResultSize();

             cookie = prrc.getCookie();

           } else {

          }

        }

      }

      ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, cookie, Control.CRITICAL) });

    }while(cookie !=null);

    ctx.close();

    //System.out.println("總共:" + li.size() + "條資訊.");

    for(int i=0;i<li.size();i++){

     Map userrow=li.get(i);

     String userdn=DbMapUtil.getValue(userrow, "userdn", ""); //如果DN等于空那麼預設為頂節點

     String name=DbMapUtil.getValue(userrow, "name", ""); //如果DN等于空那麼預設為頂節點

     if(userdn.length() >0){ 

       String userdns=userdn.replace("CN="+name, "");

        if(userdns.trim().length() ==0){

         userrow.put("orgid","-1000");

        }else{

         userdns=userdn.replace("CN="+name+",", "");

         if(usermap !=null){

          userrow.put("orgid",usermap.get(userdns));

         }

        }

   // System.out.println(userrow.toString());

     list.add(userrow);

     }

    }

   } catch (Exception e) {

    e.printStackTrace();

    return null;

   }

   return list;

  }

  public static void main(String args[]) {

   // 執行個體化

   AdUserSys ad = new AdUserSys();

   Map<String,String> usermap=new HashMap<String, String>();

   usermap.put("OU=Domain Controllers", "5828");

   usermap.put("OU=行政部", "12844");

   usermap.put("OU=人力部,OU=行政部", "53324");

   usermap.put("OU=管理部,OU=行政部", "12847");

   usermap.put("OU=杭州慧智電子科技", "53308");

     ad.getADInfo("192.168.0.14","389","shejiguanli\\administrator","abc123!","","shejiguanli","com",usermap);

   //ad.getUnit("192.168.0.14","389","shejiguanli\\administrator","abc123!","","shejiguanli","com");

  }

 }

繼續閱讀