package com.eh.ad;
/**
* JAVA 读取AD用户信息
* aa00a00
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
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;
public class EhrADOperTest {
public List<EhrPo> GetADInfo(String userName, String passwd, String host,
String port, String domain) throws IOException {
List<EhrPo> ehrList = new ArrayList();// 返回的list
String url = new String("ldap://" + host + ":" + port);
String user = userName.indexOf(domain) > 0 ? userName : userName
+ domain;
Hashtable HashEnv = new Hashtable();
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别
HashEnv.put(Context.SECURITY_PRINCIPAL, userName); // AD User
HashEnv.put(Context.SECURITY_CREDENTIALS, passwd); // AD// Password
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类
HashEnv.put(Context.PROVIDER_URL, url);
HashEnv.put(Context.BATCHSIZE, "4100");
try {
LdapContext ctx = new InitialLdapContext(HashEnv, null);
ctx.setRequestControls(new Control[] { new PagedResultsControl(
5000, Control.CRITICAL) });
// 域节点
String searchBase = "DC=genomics,DC=cn";
// LDAP搜索过滤器类
String searchFilter = "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";
// String searchFilter = "objectClass=User";
// 搜索控制器
SearchControls searchCtls = new SearchControls(); // Create the
searchCtls.setCountLimit(4110);
// search
// controls
// 创建搜索控制器
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Specify
System.out.println(searchCtls.getCountLimit());
// 设置搜索范围
// searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE); //
String returnedAtts[] = { "Pwd-Last-Set", "User-Password", "mail",
"description" };// 定制返回属性
searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集
ehrList = ldapDatalistPage(ctx, searchBase,searchFilter);
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
System.err.println("Throw Exception : " + e);
}
return ehrList;
}
public List ldapDatalistPage(LdapContext context, String base,
String objectClass) {
List resultlist = new ArrayList();
int pageSize = 5000; // 1000 entries per page
byte[] cookie = null;
int total;
try {
context.setRequestControls(new Control[] { new PagedResultsControl(
pageSize, Control.CRITICAL) });// 分页读取控制
do {// 循环检索数据
// Perform the search
SearchControls searchCtls = new SearchControls(); // Create the
// 创建搜索控制器
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Specify
String returnedAtts[] = { "Pwd-Last-Set", "User-Password", "mail",
"description" };// 定制返回属性
searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集
NamingEnumeration results = context.search(base,objectClass, searchCtls); // 查询所有信息
while (results != null && results.hasMoreElements()) {// 遍历结果集
SearchResult sr = (SearchResult) results.next();// 得到符合搜索条件的DN
EhrPo ehr = new EhrPo(); // 接收属性值的对象;
int count=0;
Attributes Attrs = sr.getAttributes();// 得到符合条件的属性集
if (Attrs != null) {
try {
for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
Attribute Attr = (Attribute) ne.next();// 得到下一个属性
// 读取属性值
for (NamingEnumeration e = Attr.getAll(); e
.hasMore(); count++) {
if ("mail".equals(Attr.getID().toString())&&Attr.getID()!=null) {
ehr.setUseremail(e.next().toString());
}
if ("description".equals(Attr.getID().toString())&&Attr.getID()!=null) {
ehr.setUsercode(e.next().toString().toUpperCase());
}
}
}
} catch (NamingException e) {
e.printStackTrace();
}
}
if (ehr.getUsercode() != null && ehr.getUseremail() != null) {
resultlist.add(ehr);
}
}
// Examine the paged results control response
Control[] controls = context.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();
}
}
}
// Re-activate paged results
context.setRequestControls(new Control[] { new PagedResultsControl(
pageSize, cookie, Control.CRITICAL) });
} while (cookie != null);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("总共:" + resultlist.size() + "条信息.");
return resultlist;
}
public static void main(String[] args) throws IOException {
EhrADOperTest test = new EhrADOperTest();
// String userName = "P_ehr"; // 用户名称
// String passwd = "@HNT78901";
// String host = "192.168.16.1"; // AD服务器
// String port = "389"; // 端口
// String domain = "@genomics.cn"; // 邮箱的后缀名
List<EhrPo> list = test.GetADInfo("P_ehr", "@HNT78901", "192.168.16.1",
"389", "@genomics.cn");
for (EhrPo ehr : list) {
System.out.println(ehr.getUsercode() + " " + ehr.getUseremail());
}
System.out.println(list.size());
}
}