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");
}
}