1. 程式人生 > >AD 域服務簡介(二)- Java 獲取 AD 域用戶

AD 域服務簡介(二)- Java 獲取 AD 域用戶

set env red smo 關系數據庫 sign exception ini 性能

博客地址:http://www.moonxy.com

一、前言

先簡單簡單回顧上一篇博文中關於 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 = "[email protected]"; 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); } } }

輸出的結果如下:

技術分享圖片

AD 域服務簡介(二)- Java 獲取 AD 域用戶