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 = "[email protected]";// 注意用户名的写法:domain\User 或 [email protected]
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();
}
}

原文地址:http://wibiline.iteye.com/blog/1840739

时间: 2024-12-28 23:26:09

LDAP方式连接AD获取用户信息的相关文章

小程序获取用户信息的方式

一.在此之前,小程序获取微信的用户信息,用的都是wx.getUserInfo //例如 onLoad() { var that = this; wx.getUserInfo({ this.setData({ thumb: res.userInfo.avatarUrl, nickname: res.userInfo.nickName }) }) } 二.自从微信接口有了新的调整之后 wx.getUserInfo()便不再出现授权弹窗了(PS:但仍能用于获取已授权用户数据),需要使用button做引

微信小程序 - 获取用户信息的几种方式

1. 老接口(上线使用-测试用button先获取用户信息) 1 // 登录 2 wx.login({ 3 success: res => { 4 // 发送 res.code 到后台换取 openId, sessionKey, unionId 5 // 也就是发送到后端,后端通过接口发送到前端,前端接收用户信息等.... 6 wx.setStorageSync('code', res.code); 7 console.log(wx.getStorageSync('code')) 8 9 // 获

小程序获取用户信息的不同方式

使用标签open-data ,和属性type(wxml) 可在wxml显示用户信息(自己的), 只能显示,但不能获取信息 type: userAvatarUrl(用户头像). userNickName(用户昵称). userCountry(用户国家). userCity(用户城市) 例如: <open-data type="userNickName"></open-data> <open-data type="userCountry"&

微信企业号 获取用户信息

业务操作最基础的一个功能是获取访客的身份,传统的获取方式是提供一个登录页面用以访客登录. 在微信企业号中,用户在微信中访问页面时,可以根据相关API获取此用户的微信账号信息,以此来匹配业务服务器存储的相关用户信息. 目录 1.  介绍 2.  代码示例 1. 介绍 1.1 说明 企业号的网页开发,说白了就是移动端web开发,特殊点在于如何获取微信用户的身份信息. 在企业号中可以进行如下步骤获取微信用户信息: 访问一个业务页面时,可通过OAuth验证接口获取此用户信息 → 根据code获取user

微信快速开发框架V2.3--增加语音识别及网页获取用户信息(八),代码已更新至Github

不知不觉,版本以每周更新一次的脚步进行着,接下来应该是重构我的代码及框架的结构,有朋友反应代码有点乱,确实如此,当时写的时候只是按照订阅号来写的,后来才慢慢增加到支持API接口.目前还在开发第三方微信平台,旨在使用户能够无需自己开发就能简易搭建微信平台. 更新内容 1.增加支持语音识别 2.增加"网页授权获取用户基本信息" 语音识别其实是对Voice信息的一个扩展,您必须启用语音识别功能,启用后会在VoiceMessage中增加一个Recongnition字段,我们可以判断这个字段的内

微信公众号开发之网页授权(获取用户信息)

这次暑假留在学校参与工作室的项目,对微信公众号比较感兴趣,所以参与这方面的学习研究. 昨天完成了关于网页授权,获取用户信息方面的功能,所以乘热打铁,写上一篇.实现本篇涉及的 功能,还需要完成一些基础.在写完这篇博客后,我会尽快补上. -------------------------废话不多说直入正题 需要的工具: 微信公众号(可以申请,但做开发的,可以申请测试号,申请详细不多说了) 服务器(可以自行购买,我使用的是新浪的sae.) 编辑器(随意,不做推荐) 微信公众号开发文档(地址) ----

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s

【CURL】模拟登录网站并获取用户信息

模拟登录网站并获取用户信息 前言 这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息. 前后端分离 本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接进行数据操作. 传统模拟登录的方式在页面上找到表单元素,直接进行模拟表单提交. 近两年前端技术趋于完善,实现了前后端分离. 分析页面元素 秒拍官网地址 http://www.miaopai.com/ 通过审查元素以及源代码查找,在本页面并没有form标签,由此推断页面是通过js进行提交的. 查找提交

php 微信开发获取用户信息如何实现

php 微信开发获取用户信息 获取用户信息的大致算法是 用户授权登录第三方网站, 重点:scope参数: snsapi_basic 静默登录,不需要用户授权,只能获取到openid: snsapi_userinfo ,需要用户点击授权,能获取到openid和所有用户信息: 第一步:先获取用户的code值: 第二步:根据code值去获取access_token,每次请求的值都不一样,如果没有使用,每五分钟更新一次: 第三步:根据access_token获取用户信息: 1.获取code代码实现: g