LDAP查询AD信息

时间:2022-06-19 00:49:37

更多解释信息请百度,哈哈哈哈哈哈哈

public class AdUtil
{
private static Logger logger = Logger.getLogger(AdUtil.class);

public static String uimurl = PropertiesUtil.readValue("gzhr_info", "zgc.uim.rest");
public static String uimrestproxy = PropertiesUtil.readValue("gzhr_info", "uim.proxy.username");
public static String proxypassword = PropertiesUtil.readValue("gzhr_info", "uim.proxy.password");
public static String uim_ou_addn = PropertiesUtil.readValue("gzhr_info", "uim.ou.addn");
public static String uim_ou_oucode = PropertiesUtil.readValue("gzhr_info", "uim.ou.oucode");
public static String uim_ou_gzouid = PropertiesUtil.readValue("gzhr_info", "uim.ou.gzouid");


LdapContext context = null;
private String ldapHost;
private int ldapVersion;
private int ldapport;
private int ldapScope;
private String ldapUser;
private String password;
private String baseDn;

/**
* ldapHost:IP地址
* ldapVersion:ldap版本
* ldapport:端口
* ldapScope:查询域
* ldapUser:管理员
* password:密码
* baseDn:根节点
* @param adName
*/
public void initProperties(String adName) {
this.ldapHost = PropertiesUtil.readValue(adName, "ldapHost");
this.ldapVersion = Integer.parseInt(PropertiesUtil.readValue(adName, "ldapVersion"));
this.ldapport = Integer.parseInt(PropertiesUtil.readValue(adName, "ldapport"));
this.ldapScope = Integer.parseInt(PropertiesUtil.readValue(adName, "ldapScope"));
this.ldapUser = PropertiesUtil.readValue(adName, "ldapUser");
this.password = PropertiesUtil.readValue(adName, "password");
this.baseDn = PropertiesUtil.readValue(adName, "baseDn");
}

/**
* 初始化链接
* @return
* @throws Exception
*/
public LdapContext getcon()
throws Exception
{
String AUTH_TYPE = "simple";
String CONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
Hashtable<String , String> env = new Hashtable<String , String>();
env.put("java.naming.factory.initial", CONTEXT_FACTORY);
env.put("java.naming.security.authentication", AUTH_TYPE);
env.put("java.naming.provider.url", "ldap://" + this.ldapHost + ":" + this.ldapport + "/" + this.baseDn);
env.put("java.naming.security.principal", this.ldapUser);
env.put("java.naming.security.credentials", this.password);
return new InitialLdapContext(env,
null);
}

/**
* 关闭链接
*/
public void closead()
{
if (this.context != null)
try {
this.context.close();
} catch (NamingException e) {
e.printStackTrace();
}
}


public List<Map<String,String>> listAllUser(String type)
{
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
// 域节点 OU=办公室,OU=测试集团,DC=cstest,DC=com,查询该节点以下的所有符合条件的数据
String searchBase = "OU=安全保卫监督部,OU=测试集团";
// LDAP搜索过滤器类
// cn=*name*模糊查询 cn=name 精确查询 ,String searchFilter ="(&(objectClass="+type+")("+filter+"=*"+name+"*))";
String searchFilter ="(objectClass="+type+")";
try
{
this.context = getcon();
// 创建搜索控制器
SearchControls searchCtls = new SearchControls();
// 设置搜索范围
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// 设置返回属性集 不设置则返回所有属性
String[] returnedAtts = {"samaccountname","cn","distinguishedname","mobile","mail","department","objectclass"};
searchCtls.setReturningAttributes(returnedAtts);
// 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
NamingEnumeration entries = this.context.search(searchBase, searchFilter, searchCtls);
// 初始化搜索结果数为0
int totalResults = 0;
int rows = 0;
while(entries.hasMoreElements()){
// 得到符合搜索条件的DN
SearchResult entry = (SearchResult)entries.next();
++rows;
String userName = entry.getName();
System.out.println("用户:"+userName);
// 得到符合条件的属性集
Attributes at = entry.getAttributes();
if (at != null) {
Map map = new HashMap();
for(NamingEnumeration ne = at.getAll(); ne.hasMore(); ) {
// 得到下一个属性
Attribute Attr = (Attribute)ne.next();
//属性名
String attrid=Attr.getID().toString();
System.out.print(attrid+'\t');
// 读取属性值
for(NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++){
//属性值objectClass有四个值top、 person、 organizationalPerson、 user,但put的时候key一样,所以value会覆盖前面的值
String attrvalue =e.next().toString();
System.out.print(attrvalue+" ");
map.put(attrid,attrvalue);
}
System.out.println();
}
list.add(map);
}
System.out.println("---------------");
}
System.out.println("************************************************");
System.out.println("Number: " + totalResults);
System.out.println("总共用户数:"+rows);
}catch (NamingException e){
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
closead();
}
return list;
}

//---------------------MAIN----------------

public static void main(String[] args) {
AdUtil adUtil = new AdUtil();
adUtil.initProperties("csad");
List<Map<String,String>> list= adUtil.listAllUser("organizationalPerson");
for(int i=0,lengths=list.size();i<lengths;i++){
Map<String,String> map = list.get(i);
for(Map.Entry<String,String> keyset:map.entrySet()){
System.out.println("Key:"+keyset.getKey()+",Value:"+keyset.getValue());
}
System.out.println("-----------------------------");
}
}

}
输出为:

用户:CN=唐涛
mailtang.tao@tt.com
mobile13999999991
department安全监督部
objectClasstop person organizationalPerson user
sAMAccountNametang.songtao
distinguishedNameCN=唐涛,OU=安全保卫监督部,OU=测试集团,DC=cstest,DC=com
cn唐涛
---------------
用户:CN=曾为昀
mailzeng.weiyun@tt.com
mobile18664888888
department安全监督部
objectClasstop person organizationalPerson user
sAMAccountNamezeng.yun
distinguishedNameCN=曾为昀,OU=安全保卫监督部,OU=测试集团,DC=cstest,DC=com
cn曾为昀


************************************************
Number: 38
总共用户数:4
 
Key:mail,Value:tang.tao@tt.comKey:cn,Value:唐涛Key:sAMAccountName,Value:tang.taoKey:department,Value:安全监督部Key:objectClass,Value:userKey:distinguishedName,Value:CN=唐涛,OU=安全保卫监督部,OU=测试集团,DC=cstest,DC=comKey:mobile,Value:139999999991-----------------------------Key:mail,Value:zeng.yun@tt.comKey:cn,Value:曾为昀Key:sAMAccountName,Value:zeng.weiyunKey:department,Value:安全监督部Key:objectClass,Value:userKey:distinguishedName,Value:CN=曾为昀,OU=安全保卫监督部,OU=测试集团,DC=cstest,DC=comKey:mobile,Value:18664888888