|
|
package com.spring.common.utils;
import java.io.IOException;import java.util.HashMap;import java.util.Map;
import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.PartialResultException;import javax.naming.directory.Attributes;import javax.naming.directory.SearchControls;import javax.naming.directory.SearchResult;import javax.naming.ldap.Control;import javax.naming.ldap.LdapContext;import javax.naming.ldap.PagedResultsControl;import javax.naming.ldap.PagedResultsResponseControl;
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.data.redis.core.RedisTemplate;
/** * * @ClassName: LdapReadUtils * @Description: 读取数据 * @author: LR * @date: 2025年9月5日 下午12:04:30 * @Copyright: */public class LdapReadUtils { private static final Logger logger = LoggerFactory.getLogger(LdapReadUtils.class); /** * * @Title: getAllLdapAccount * @Description: 查询所有域控行号 通过分页查询来做 * @author: LR * @date 2025年9月5日 下午12:07:09 * @return: Map<String,String> */ public static Map<String, String> getAllLdapAccount(LdapContext ctx, String ldapBase, RedisTemplate<String, Object> redisTemplate) throws NamingException, IOException { byte[] cookie = null; // 设置返回所有属性
SearchControls controls = new SearchControls(); controls.setReturningAttributes(new String[] { "sAMAccountName", "displayName", "distinguishedName", "manager" }); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); //
String nameFilter = "(&(objectClass=user)(objectCategory=person)(!(objectClass=computer)))"; Map<String, String> ldapAccountMap = new HashMap<>(); int pageNums = 1; int countNums = 0; //循环执行
do{ ctx.setRequestControls(new Control[] {new PagedResultsControl(100, cookie, true)}); NamingEnumeration<SearchResult> results = null; try{ results = ctx.search(ldapBase, nameFilter, controls); countNums = 1; //获取数据 读取人员组织架构+域控账号
while (results.hasMore()) { SearchResult result = results.next(); Attributes attrs = result.getAttributes(); String distinguishedName = attrs.get("distinguishedName").get().toString(); String sAMAccountName = attrs.get("sAMAccountName").get().toString(); ldapAccountMap.put(distinguishedName, sAMAccountName); //logger.warn("分页查询第:{}条, distinguishedName: {}, sAMAccountName: {}", countNums, distinguishedName, sAMAccountName);
redisTemplate.opsForHash().put("ldapAccount", distinguishedName, sAMAccountName); countNums++; } }catch(PartialResultException pre){ //logger.warn("Search results: {}", pre.getMessage());
throw new PartialResultException(pre.getMessage()); }finally{ ctx.setRequestControls(null); } pageNums++; // 处理服务器返回的分页响应
Control[] controlsResp = ctx.getResponseControls(); if (controlsResp != null) { for (Control control : controlsResp) { if (control instanceof PagedResultsResponseControl) { PagedResultsResponseControl prrc = (PagedResultsResponseControl) control; cookie = prrc.getCookie(); } } } else { cookie = null; } //logger.warn("分页查询结束,分码:{}, 数据统计量:{}", pageNums, countNums);
}while(cookie != null && cookie.length > 0); logger.warn("Query finished, count={}", ldapAccountMap.size()); //返回结果数据
return ldapAccountMap; }
}
|