`
wibiline
  • 浏览: 118053 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

LDAP方式连接AD获取用户信息

 
阅读更多

LDAP资料介绍可以参考:http://wenku.baidu.com/view/262742f9f705cc17552709f9.html

ldap访问AD域的的错误一般会如下格式:

Ldap load error: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 525, vece]

其中红字部分的意思如下(这些错误码跟语言无关):

525 - 用户没有找到

52e - 证书不正确

530 - not permitted to logon at this time

532 - 密码期满

533 - 帐户不可用

701 - 账户期满

773 - 用户必须重设密码

import java.util.Hashtable;
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;

public class LdapADHelper {
	public LdapADHelper() {
	}
	private String host,url,adminName,adminPassword;
	private LdapContext ctx = null;
	/**
	 * 初始化ldap
	 */
	public void initLdap(){
		//ad服务器
		this.host = "xxx.com"; // AD服务器
		this.url = new String("ldap://" + host );//默认端口为80的可以不用填写,其他端口需要填写,如ldap://xxx.com:8080
		this.adminName = "admin@xxx.com";// 注意用户名的写法:domain\User 或  User@domain.com
		this.adminPassword = "admin";			
		Hashtable HashEnv = new Hashtable();
		HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP访问安全级别
		HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User
		HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); // AD Password
		HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工厂类
		HashEnv.put(Context.PROVIDER_URL, url);
		try {
			 ctx = new InitialLdapContext(HashEnv, null);
			 System.out.println("初始化ldap成功!");
		} catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Throw Exception : " + e);
		}
	}
	/**
	 * 关闭ldap
	 */
	public void closeLdap(){
		try {
			this.ctx.close();
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * @param type organizationalUnit:组织架构 group:用户组 user|person:用户
	 * @param name
	 * @return
	 */
	public String GetADInfo(String type ,String filter ,String name) {

		String userName = name; // 用户名称
		if (userName == null) {
			userName = "";
		}
		String company = "";
		String result = "";
		try {
			// 域节点
			String searchBase = "DC=xx,DC=xxx,DC=com";
			// LDAP搜索过滤器类
			//cn=*name*模糊查询 cn=name 精确查询
//			String searchFilter = "(objectClass="+type+")";
			String searchFilter = "(&(objectClass="+type+")("+filter+"=*" + name + "*))";
			// 创建搜索控制器
			SearchControls searchCtls = new SearchControls(); 
			//  设置搜索范围
			searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
//			String returnedAtts[] = {  "memberOf" }; // 定制返回属性
//		searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集 不设置则返回所有属性
			// 根据设置的域节点、过滤器类和搜索控制器搜索LDAP得到结果
			NamingEnumeration answer = ctx.search(searchBase, searchFilter,searchCtls);// Search for objects using the filter
			// 初始化搜索结果数为0
			int totalResults = 0;// Specify the attributes to return
			int rows = 0;
			while (answer.hasMoreElements()) {// 遍历结果集
				SearchResult sr = (SearchResult) answer.next();// 得到符合搜索条件的DN
				++rows;
				String dn = sr.getName();
				System.out.println(dn);
				Attributes Attrs = sr.getAttributes();// 得到符合条件的属性集
				if (Attrs != null) {
					try {
						for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
							Attribute Attr = (Attribute) ne.next();// 得到下一个属性
							System.out.println(" AttributeID=属性名:"+ Attr.getID().toString());
							// 读取属性值
							for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
								company = e.next().toString();
								System.out.println("    AttributeValues=属性值:"+ company);
							}
							System.out.println("    ---------------");

						}
					} catch (NamingException e) {
						System.err.println("Throw Exception : " + e);
					}
				}// if
			}// while
			System.out.println("************************************************");
			System.out.println("Number: " + totalResults);
			System.out.println("总共用户数:"+rows);
		} catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Throw Exception : " + e);
		}
		return result;
	}

	public static void main(String args[]) {
		// 实例化
		LdapADHelper ad = new LdapADHelper();
		ad.initLdap();
  	ad.GetADInfo("user","cn","李XX");//查找用户
		ad.GetADInfo("organizationalUnit","ou","工程");//查找组织架构
  	ad.GetADInfo("group","cn","福建xxx");//查找用户组
		
		ad.closeLdap();
	}
}

 

分享到:
评论

相关推荐

    Springboot-LDAP针对AD域控做用户和组织进行同步.zip

    Spring Security是一个强大的安全框架,它可以处理认证和授权,而与LDAP的结合则允许从目录服务器获取用户信息,进行身份验证和授权。 在“Springboot-LDAP针对AD域控做用户和组织进行同步”的场景中,开发人员会...

    LDAP实现AD域账号验证 - Java/SpringBoot

    `LdapAuthenticationProvider`负责从AD服务器获取用户信息并进行密码验证。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired ...

    Python+ldap3 实现操作AD域控

    通过Python,基于ldap3来实现操作AD域控,账户信息获取、解锁账户、禁用账户、启用账户、重置密码等功能。

    java使用ldap修改ad域用户密码

    Java 使用 LDAP 修改 AD 域用户密码 本文将详细介绍如何使用 Java 语言通过 LDAP 协议修改 Windows Active Directory 域用户的密码。同时,本文也将对相关概念进行解释,以便读者更好地理解整个过程。 LDAP 概念 ...

    使用Python读取Ldap中的用户名

    - **初始化连接**:使用`ldap.initialize()`方法创建LDAP连接对象,并设置协议版本为3。 - **简单绑定**:通过`simple_bind_s()`方法以管理员身份登录,成功后输出“ldap connect successfully”。 ##### 搜索过滤...

    ldap 连接 AD

    1. ADOperator.java:这个文件很可能包含了一个操作AD的类,可能实现了连接AD、执行查询、修改目录信息等操作。在Java中,通常会使用JNDI(Java Naming and Directory Interface)库来实现与LDAP的交互。例如,创建...

    Sync_Data.rar_C LDAP AD_c++ ldap_ldap_数据同步

    例如,为了验证用户身份,可以使用AD的认证服务,或者查询AD获取用户权限。集成的关键在于理解AD的架构,包括域、组织单位(OU)、全局编录等概念,并能正确构建和解析AD的DN(Distinguished Name)。 3. **LDAP...

    LDAP加密访问AD(overssl)(LDAPS )C++

    1. **初始化LDAP连接**:创建一个`LDAP*`类型的指针,然后使用`ldap_init()`函数初始化连接。传入AD服务器的DNS名称和端口号(默认的LDAPS端口是636)。 ```cpp LDAP* ldapHandle = NULL; ldapHandle = ldap_...

    Adldap2, 用于人类的PHP LDAP包.zip

    Adldap2, 用于人类的PHP LDAP包 Adldap2 使用LDAP不需要硬处理。Adldap2是一个经过测试的PHP包,它使用 Active Record Pattern 提供LDAP身份验证和目录管理工具。索引快速入门配置文件连接认证查

    java使用ldap修改ad域用户密码收集.pdf

    8、在编写 Java 代码时,需要使用 Hashtable 对象来存储 LDAP 连接的参数,使用 Socket 对象来连接 LDAP 服务器,并使用 SSL/TLS 加密协议来确保密码修改的安全性。 9、在编写 Java 代码时,需要使用相关的 LDAP ...

    Python 和 LDAP进行域认证

    使用`python-ldap`进行域认证,首先需要连接到LDAP服务器,然后执行搜索操作以找到用户账户,最后进行绑定。以下是一个简单的示例代码: ```python import ldap # 连接 LDAP 服务器 l = ldap.initialize('ldap://...

    java连接AD进行用户登陆

    2. **LDAP (Lightweight Directory Access Protocol)**:轻量级目录访问协议,用于访问和管理存储在目录服务中的信息,是访问 AD 的主要协议之一。 3. **JNDI (Java Naming and Directory Interface)**:Java 命名和...

    JAVA通过LDAP+SSL(证书)实现用户和组织(部门)增删改查.zip

    这些功能通常用于大型企业的用户管理,例如Active Directory(AD)服务。 首先,让我们理解LDAP。LDAP是一种目录服务协议,它允许快速查找分布式数据库中的信息,如用户账户、组、资源等。在Java中,我们可以使用...

    LdapBrowser2.82版和LDAP使用手册

    1. **连接设置**:在LdapBrowser中输入服务器地址、端口、认证方式等信息,建立连接。 2. **浏览目录**:展开目录树,查看各个条目及其属性。 3. **搜索操作**:利用过滤器查找特定条目,可以按名称、属性值等条件...

    java使用ldap修改ad域中的用户密码

    Java 使用 LDAP 修改 AD 域中的用户密码需要满足一定的环境要求,包括安装 Active Directory 域控制器、证书服务和 Java 运行环境。然后,需要使用 Java 语言编写代码来实现 LDAP 修改用户密码的操作。这个操作需要...

    LDAP Weblogic和AD之间的通信

    当WebLogic Server配置为使用AD进行身份验证时,它会查询AD目录来验证用户的凭据,并获取用户的权限信息。这通常通过配置WebLogic的域安全策略实现,包括设置域的全局安全性、定义认证提供者、配置安全 Realm 和角色...

    获取AD帐号用户邮箱源码

    本项目标题为“获取AD帐号用户邮箱源码”,意味着我们要讨论如何通过编程方式从AD中检索用户账户信息,并特别关注用户的电子邮件地址。这里我们将详细探讨相关知识点,包括AD的基本概念、访问AD的API、编程语言的...

    C# 、.NET 读取AD域里用户名或组

    删除用户则需要获取用户对象的DirectoryEntry实例,然后调用Remove方法。例如: ```csharp var container = new DirectoryEntry("LDAP://OU=Users,DC=yourdomain,DC=com"); var user = container.Invoke("Create...

Global site tag (gtag.js) - Google Analytics