AD 域服务简介(二)- Java 获取 AD 域用户
关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用
一、前言
先简单简单回顾上一篇博文中关于 AD 域和 LDAP目录访问协议的基本概念。
AD(Active Directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,使用的协议为 LDAP,安装了AD 的服务器称为 DC 域控制器,存储整个域的对象的信息并周期性更新,其中的对象分为三大类:资源(如印表机)、服务(如电子邮件)、和用户(即帐户或用户,以及组)。
通常大家都会将 LDAP 与关系数据库相比,认为 LDAP 是另一种的存贮方式,然后在读性能上进行比较。实际上,这种对比的基础是不正确的。LDAP 和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网络数据库,对象数据库),前者是存贮模式和访问协议。LDAP 是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言 SQL 属同一级别。LDAP 最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。
二、Java 获取 AD 域用户
Java 获取 AD 域用户通常用于单点登录(Single Sign On,SSO)。
package com.moonxy.ad; import java.util.Properties; 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.InitialLdapContext; import javax.naming.ldap.LdapContext; /** * @Description:获取AD域用户 * @author moonxy * @date 2018-05-14 */ public class ADUtils { public static void main(String[] args) { Properties env = new Properties(); //使用UPN格式:User@domain或SamAccountName格式:domain\\User String adminName = "administrator@moonxy.com"; String adminPassword = "smartdot&2014";//password String ldapURL = "LDAP://192.168.1.103:389";//ip:port env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP访问安全级别:"none","simple","strong" env.put(Context.SECURITY_PRINCIPAL, adminName);// AD User env.put(Context.SECURITY_CREDENTIALS, adminPassword);// AD Password env.put(Context.PROVIDER_URL, ldapURL);// LDAP工厂类 try { LdapContext ctx = new InitialLdapContext(env, null); //搜索控制器 SearchControls searchCtls = new SearchControls(); //创建搜索控制器 searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); //LDAP搜索过滤器类,此处只获取AD域用户,所以条件为用户user或者person均可 //(&(objectCategory=person)(objectClass=user)(name=*)) String searchFilter = "objectClass=user"; //AD域节点结构 String searchBase = "OU=Java开发组,OU=软件研发部,DC=moonxy,DC=com"; String returnedAtts[] = { "url", "employeeID", "mail", "name", "userPrincipalName", "physicalDeliveryOfficeName", "departmentNumber", "telephoneNumber", "homePhone", "mobile", "department", "sAMAccountName", "whenChanged"}; // 定制返回属性 searchCtls.setReturningAttributes(returnedAtts); NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls); while (answer.hasMoreElements()) { SearchResult sr = (SearchResult) answer.next(); System.out.println("<<<::[" + sr.getName()+"]::>>>>");//返回格式一般是CN=xxxx,OU=xxxx Attributes Attrs = sr.getAttributes();//得到符合条件的属性集 if (Attrs != null) { for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) { Attribute Attr = (Attribute) ne.next();//得到下一个属性 System.out.print(Attr.getID().toString() + ":"); //读取属性值 for (NamingEnumeration e = Attr.getAll(); e.hasMore();) { String userInfo = e.next().toString(); System.out.print(userInfo); } System.out.println(""); } } } ctx.close(); }catch (NamingException e) { e.printStackTrace(); System.err.println("Problem searching directory: " + e); } } }
输出的结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通