关于Ldap对AD域账户的增删改查

今天心情很不爽,那啥也不懂的老板,又来直接修改了我的需求,还很自信的对我们研发人员说:“他这产品经理已经做得很好了!”,在这里我回复一句,以我这么多年的经验,做得跟一条狗似的,还自我感觉良好!!!好啦,不扯别的啦,来讲讲Ldap对AD域账户的操作吧!至于Ldap和ad今天就不做详细解释了,有兴趣的朋友可以看看上一篇博文,里面有详细的介绍!直接上代码:

/**
 * @Description:
 *
 * @Title: LdapByUser.java
 * @Package com.joyce.ad
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-8-8 上午10:39:35
 * @version V2.0
 */
package com.joyce.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.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:
 *
 * @ClassName: LdapByUser
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-8-8 上午10:39:35
 * @version V2.0
 */
public class LdapByUser {
	DirContext dc = null;
	String root = "DC=2003,DC=com"; // LDAP的根节点的DC

	/**
	 * @Description: 程序主入口
	 *
	 * @param args
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-11 上午10:27:15
	 * @version V2.0
	 */
	public static void main(String[] args) {
		LdapByUser ldap = new LdapByUser();
//		ldap.delete("CN=涛涛,OU=研发部,DC=2003,DC=com");
//		ldap.renameEntry("CN=joyce.luo,OU=test,DC=2003,DC=com", "CN=joyce.luo,OU=研发部,DC=2003,DC=com");
		SearchResult sr = ldap.searchByUserName(ldap.root, "joyce.luo");
		System.out.println(sr.getName());
//		ldap.modifyInformation(sr.getName(), "test");
		ldap.searchInformation(ldap.root);
		ldap.close();
	}

	/**
	 *
	 */
	public LdapByUser() {
		super();
		init();
	}

	/**
	 * @Description: Ldap连接
	 *
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:32:15
	 * @version V2.0
	 */
	public void init() {
		Properties env = new Properties();
		String adminName = "[email protected]";// [email protected]
		String adminPassword = "admin";// password
		String ldapURL = "LDAP://10.10.2.153:389";// ip:port
		env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.SECURITY_AUTHENTICATION, "simple");// "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("认证成功");
		} catch (Exception e) {
			System.out.println("认证失败");
			e.printStackTrace();
		}
	}

	/**
	 * @Description:关闭Ldap连接
	 *
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:31:44
	 * @version V2.0
	 */
	public void close() {
		if (dc != null) {
			try {
				dc.close();
			} catch (NamingException e) {
				System.out.println("NamingException in close():" + e);
			}
		}
	}

	/**
	 * @Description: 新增域账号
	 *
	 * @param newUserName
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:32:50
	 * @version V2.0
	 */
	public void add(String newUserName) {
		try {
			BasicAttributes attrs = new BasicAttributes();
			BasicAttribute objclassSet = new BasicAttribute("objectClass");
			objclassSet.add("sAMAccountName");
			objclassSet.add("employeeID");
			attrs.put(objclassSet);
			attrs.put("ou", newUserName);
			dc.createSubcontext("ou=" + newUserName + "," + root, attrs);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Exception in add():" + e);
		}
	}

	/**
	 * 删除
	 *
	 * @param dn
	 */
	public void delete(String dn) {
		try {
			dc.destroySubcontext(dn);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Exception in delete():" + e);
		}
	}

	/**
	 * @Description: 重命名节点
	 *
	 * @param oldDN
	 * @param newDN
	 * @return
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:31:14
	 * @version V2.0
	 */
	public boolean renameEntry(String oldDN, String newDN) {
		try {
			dc.rename(oldDN, newDN);
			return true;
		} catch (NamingException ne) {
			System.err.println("Error: " + ne.getMessage());
			return false;
		}
	}

	/**
	 * @Description:修改
	 *
	 * @param dn
	 * @param employeeID
	 * @return
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 下午02:31:30
	 * @version V2.0
	 */
	public boolean modifyInformation(String dn, String employeeID) {
		try {
			System.out.println("updating...\n");
			ModificationItem[] mods = new ModificationItem[1];
			// 修改属性
			Attribute attr0 = new BasicAttribute("OU",employeeID);
			mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);
			/* 修改属性 */
			dc.modifyAttributes(dn+",DC=2003,DC=com", mods);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println("Error: " + e.getMessage());
			return false;
		}
	}

	/**
	 * @Description:搜索节点
	 *
	 * @param searchBase
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 上午11:26:49
	 * @version V2.0
	 */
	public void searchInformation(String searchBase) {
		try {
			SearchControls searchCtls = new SearchControls();
			searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
			String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
			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: 指定搜索节点搜索制定域用户
	 *
	 * @param searchBase
	 * @param userName
	 * @return
	 *
	 * @Title: LdapByUser.java
	 * @Copyright: Copyright (c) 2014
	 *
	 * @author Comsys-LZP
	 * @date 2014-8-8 上午11:55:25
	 * @version V2.0
	 */
	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) {
			e.printStackTrace();
			System.err.println("Throw Exception : " + e);
		}
		return null;
	}
}

这些代码都亲测可行,如有不懂,请留言!!!祝各位工作愉快!!!

关于Ldap对AD域账户的增删改查

时间: 2024-10-07 14:50:43

关于Ldap对AD域账户的增删改查的相关文章

AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作

博客地址:http://www.moonxy.com 关于AD 域服务器搭建及其使用,请参阅:AD 域服务简介(一) - 基于 LDAP 的 AD 域服务器搭建及其使用 Java 获取 AD 域用户,请参阅:AD 域服务简介(二)- Java 获取 AD 域用户 一.前言 在日常的开发中,为了实现单点登录,需要对域用户进行增删改查操作,以维持最新的用户信息,确保系统的安全. 二.Java 对 AD 域用户的增删改查操作 package com.moonxy.ad; import java.uti

对系统日历CalendarProvider进行增删改查操作的测试

TestCalendarEvent 这是一个对系统日历CalendarProvider进行增删改查操作的测试demo: 在该示例中演示了日历账户的增删改查.日历事件及事件提醒的增删改查: 代码比较简单,主要是需要了解系统日历相关表及其字段:可参考官方文档或译文:http://blog.csdn.net/super_spy/article/details/51276618 Demo下载地址: Github地址 CSDN下载    

Java使用LdAP获取AD域用户

随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类--资源(如印表机).服务(如电子邮件).和人物(即帐户或用户,以及组

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)

Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式): # apt-get install libnss-ldap   (中间直接回车,忽略) # vi /etc/nsswitch.conf passwd: files ldap group:  files ldap shadow: files ldap :wq # vi /etc/ldap.conf base dc=ming,dc=com uri ldap://10.0.0.2 binddn cn=ldapadmin,cn=

CentOS 6通过ldap集成AD域账号(nslcd方式)

CentOS 6通过ldap集成AD域账号(nslcd方式): CentOS 6默认有安装nss-pam-ldapd软件(rpm -qa nss-pam-ldapd,rpm -ql nss-pam-ldapd) vi /etc/nsswitch.conf passwd: files ldapgroup: files ldapshadow: files ldap:wq vi /etc/nslcd.conf binddn cn=aa,cn=users,dc=ming,dc=com (aa为普通AD账

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

Android(java)学习笔记245:ContentProvider之银行数据库创建和增删改查的实现

1.Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentProvider  内容提供者 2. ContentProvider  内容提供者 用途:把应用程序私有的数据暴露给别的应用程序. 3.下面通过一个银行数据库创建和增删改查的实现案例说明ContentProvider的使用: (1)首先我们这里要用到数据库,首先我们必须先扩展一个抽象类SQLiteOpenH

SSH简单的增删改查逻辑流程

自学了一段时间的java了,最近开始自己做点小项目练手了,争取每做一些,总结一些,顺便复习以前所学的知识.今天遇到一个bug调了2个小时, 醉了,菜鸟调试bug,内心真的是有一亿个草泥马在奔腾啊!不过真的挺喜欢程序里面的逻辑线条的. 一. 整个MVC逻辑流程(以增加为例) 1.Jsp页面:用js实现表单中增加的方法doAdd(),单击增加按钮时则触发doAdd()方法提交表单到${basePath}nsfw/user_addUI.action这个地址 function doAdd(){