關於AD 域服務器搭建及其使用,請參閱:AD 域服務簡介(一) - 基於 LDAP 的 AD 域服務器搭建及其使用
Java 獲取 AD 域用戶,請參閱:AD 域服務簡介(二)- Java 獲取 AD 域用戶
一、前言
在日常的開發中,為了實現單點登錄,需要對域用戶進行增刪改查操作,以維持最新的用戶信息,確保系統的安全。
二、Java 對 AD 域用戶的增刪改查操作
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.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.ModificationItem; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; /** * @Description:對AD域用戶的增刪改查操作 * @author moonxy * @date 2018-05-15 */ public class ADUserUtils { DirContext dc = null; String root = "OU=Java開發組,OU=軟件研發部,DC=moonxy,DC=com"; // LDAP的根節點的DC /** * @Description:程序入口 * @author moonxy * @date 2018-05-15 */ public static void main(String[] args) { ADUserUtils utils = new ADUserUtils(); // utils.add("JimGreen"); // SearchResult sr = utils.searchByUserName(utils.root, "JimGreen"); // System.out.println(sr.getName()); // // utils.modifyInformation(sr.getName(), "M1380005"); // utils.searchInformation(utils.root); // utils.renameEntry("CN=JimGreen,OU=Java開發組,OU=軟件研發部,DC=moonxy,DC=com", "CN=JimGreen,OU=Web前端組,OU=軟件研發部,DC=moonxy,DC=com"); // utils.delete("CN=JimGreen,OU=Web前端組,OU=軟件研發部,DC=moonxy,DC=com"); utils.close(); } /** * 初始化 */ public ADUserUtils() { super(); init(); } /** * @Description:初始化AD域服務連接 * @author moonxy * @date 2018-05-15 */ public void init() { Properties env = new Properties(); String adminName = "administrator@moonxy.com";//username@domain 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); env.put(Context.SECURITY_CREDENTIALS, adminPassword); env.put(Context.PROVIDER_URL, ldapURL); try { dc = new InitialLdapContext(env, null); System.out.println("AD域服務連接認證成功"); } catch (Exception e) { System.out.println("AD域服務連接認證失敗"); e.printStackTrace(); } } /** * @Description:關閉AD域服務連接 * @author moonxy * @date 2018-05-15 */ public void close() { if (dc != null) { try { dc.close(); } catch (NamingException e) { System.out.println("NamingException in close():" + e); } } } /** * @Description:新增AD域用戶 * @author moonxy * @date 2018-05-15 */ public void add(String newUserName) { try { Attributes attrs = new BasicAttributes(true); attrs.put("objectClass", "user"); attrs.put("samAccountName", newUserName); attrs.put("displayName", newUserName); attrs.put("userPrincipalName", newUserName + "@moonxy.com"); dc.createSubcontext("CN=" + newUserName + "," + root, attrs); System.out.println("新增AD域用戶成功:" + newUserName); } catch (Exception e) { e.printStackTrace(); System.out.println("新增AD域用戶失敗:" + newUserName); } } /** * @Description:刪除AD域用戶 * @author moonxy * @date 2018-05-15 */ public void delete(String dn) { try { dc.destroySubcontext(dn); System.out.println("刪除AD域用戶成功:" + dn); } catch (Exception e) { System.out.println("刪除AD域用戶失敗:" + dn); e.printStackTrace(); } } /** * @Description:重命名AD域用戶 * @author moonxy * @date 2018-05-15 */ public boolean renameEntry(String oldDN, String newDN) { try { dc.rename(oldDN, newDN); System.out.println("重命名AD域用戶成功"); return true; } catch (NamingException ne) { System.out.println("重命名AD域用戶失敗"); ne.printStackTrace(); return false; } } /** * @Description:修改AD域用戶屬性 * @author moonxy * @date 2018-05-15 */ public boolean modifyInformation(String dn, String fieldValue) { try { ModificationItem[] mods = new ModificationItem[1]; // 修改屬性 Attribute attr0 = new BasicAttribute("homePhone",fieldValue); //mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);//新增屬性 //mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,attr0);//刪除屬性 mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr0);//覆蓋屬性 dc.modifyAttributes(dn + "," + root, mods); System.out.println("修改AD域用戶屬性成功"); return true; } catch (Exception e) { System.err.println("修改AD域用戶屬性失敗"); e.printStackTrace(); return false; } } /** * @Description:搜索指定節點下的所有AD域用戶 * @author moonxy * @date 2018-05-15 */ public void searchInformation(String searchBase) { try { SearchControls searchCtls = new SearchControls(); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); String searchFilter = "objectClass=user"; String returnedAtts[] = { "memberOf" }; searchCtls.setReturningAttributes(returnedAtts); NamingEnumeration<SearchResult> answer = dc.search(searchBase, searchFilter, searchCtls); while (answer.hasMoreElements()) { SearchResult sr = (SearchResult) answer.next(); System.out.println("<<<::[" + sr.getName() + "]::>>>>"); } } catch (Exception e) { e.printStackTrace(); } } /** * @Description:指定搜索節點搜索指定域用戶 * @author moonxy * @date 2018-05-15 */ public SearchResult searchByUserName(String searchBase, String userName) { SearchControls searchCtls = new SearchControls(); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); String searchFilter = "sAMAccountName=" + userName; String returnedAtts[] = { "memberOf" }; //定制返回屬性 searchCtls.setReturningAttributes(returnedAtts); //設置返回屬性集 try { NamingEnumeration<SearchResult> answer = dc.search(searchBase, searchFilter, searchCtls); return answer.next(); } catch (Exception e) { System.err.println("指定搜索節點搜索指定域用戶失敗"); e.printStackTrace(); } return null; } }
依次執行上面的方法,輸出的結果如下:
add 方法結果:
searchByUserName 方法結果:
searchByUserName 和 modifyInformation 方法結果:
searchInformation 方法結果:
renameEntry 方法結果:
delete 方法結果: