AD 域服务简介(二)- Java 获取 AD 域用户
博客地址:http://www.moonxy.com
關于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\\UserString adminName = "administrator@moonxy.com";String adminPassword = "smartdot&2014";//passwordString 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 Userenv.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=xxxxAttributes 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);}} }輸出的結果如下:
?
轉載于:https://www.cnblogs.com/cnjavahome/p/9038363.html
總結
以上是生活随笔為你收集整理的AD 域服务简介(二)- Java 获取 AD 域用户的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell常用参数解释($0、$1、$#
- 下一篇: 洛谷 [P1024]一元三次方程求解【二