## Active Directory -LDAP
如何从Active Directory中读取用户数据
1. 安装 域控制器
在域管理器中添加用户和组织机构
- Windows Active Directory为例
- 开始菜单--管理工具-Active Directory 用户和计算机
- 点开域名
- 右键“新建”-组织单位:按照树状结构添加组织单位
- 右键“”新建“”-“用户”:添加用户
- 在Users中添加用户
- 在组织单位中添加用户。
- 所有的用户都会被添加到Domain Users中
- 一个域用户,如果要想能够通过mstsc,即远程桌面的方式连接,必须把用户添加到“Domain Admins”中。
这样,就可以通过远程的方式操作域控制器了。
##程序源码
package testAD;
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.List;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls ;
import javax.naming.directory.Attributes;
import javax.naming.directory.Attribute;
import javax.naming.NamingEnumeration;
import javax.naming.directory.SearchResult;
public class LDAPtest {
public static void main(String[] args) {
LDAPtest ldap = new LDAPtest();
ldap.init();
}
private void init(){
DirContext ctx ;
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://172.16.133.70:389/"); //连接LDAP的URL和端口
//相信这个程序不仅仅可以用于AD,也可以用于其他的LDAP服务器。
//env.put(Context.SECURITY_AUTHENTICATION, "simple"); //以simple方式发送
env.put(Context.SECURITY_PRINCIPAL, "CN=Administrator,CN=Users,DC=usp,DC=com");
//Administrator为域控制器的管理员之一,也可以用其他的管理账号
env.put(Context.SECURITY_CREDENTIALS, "Adminstrator的密码"); //密码
//其中usp.com为域名,华胜天成为一个组织机构,本例子的目的是查询华胜天成这个组织机构下的所有用户。
String baseDN = "ou=华胜天成,DC=usp,DC=com";
//查询区域
String filter = "(&(objectClass=user))"; //条件查询是user
UserInfo userInfo;
String userName;
String displayName=null;
String mobile=null;
ArrayList<String> OU=null;
String title=null;
String department=null;
String email=null;
try {
ctx = new InitialDirContext(env); //连接LDAP服务器
SearchControls constraints = new SearchControls(); //执行查询操作
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration en = ctx.search(baseDN, filter, constraints);
userInfo = new UserInfo();
//创建一个用户信息的对象,用于存放所需要的用户信息。
if (en == null) {
System.out.println("There have no value");
} else {
while (en.hasMoreElements()) {
Object obj=en.nextElement();
if (obj instanceof SearchResult) {
SearchResult sr = (SearchResult) obj;
Attributes attributes = sr.getAttributes();
//attributes中存放了用户的所有信息,下面是按照需求获取了部分用户的信息,包括用户名、所属组织机构,电话,电子邮件等信息。
userInfo.setAttributes(attributes);
userName=userInfo.getUserName();
//获得用户名
if(userName!=null){
System.out.println("username:"+userName);
}
displayName = userInfo.getDisplayName();
//获得用户的显示名
if(displayName!=null){
System.out.println("displayname:"+displayName);
}
email = userInfo.getEmail();
if(email!=null){
System.out.println("email:"+email);
}
mobile = userInfo.getMobile();
if(mobile!=null){
System.out.println("mobile:"+mobile);
}
title = userInfo.getTitle();
if(title!=null){
System.out.println("Title:"+title);
}
department = userInfo.getDepartment();
if(department!=null){
System.out.println("department:"+department);
}
OU = userInfo.getOrganizations();
//因为组织结构是树状的,所以一个用户所属的组织结果可能会有很多层,下面得到的组织结构是一个字符串数组,从下往上逐个获得用户所属的组织机构。如先是小组名,部门名,子公司名,总公司名
if(OU!=null){
for(int i=0;i<OU.size();i++){
System.out.println("OU["+i+"]:"+OU.get(i));
}
}
TODO: 2020/8/28
//利用UserInfo中的数据进行业务处理
//...............
}
}
}
} catch (javax.naming.AuthenticationException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println("erro:" + e);
}
}
}
class UserInfo{
Attributes attributes ;
String userName;
String displayName=null;
String mobile=null;
String[] organizations;
String title=null;
String department=null;
String email=null;
public void setAttributes(Attributes attributes){
this.attributes=attributes;
//传入用户的属性,包含了用户所有的属性。下面通过get方法获得需求所要求获得的属性值。
}
public String getUserName() {
String userName=null;
try {
userName = attributes.get("CN").get(0).toString();
}catch (Exception e){
return null;
}
return userName;
}
public String getDisplayName() {
String displayName=null;
try {
displayName = attributes.get("displayname").get(0).toString();
}catch (Exception e){
return null;
}
return displayName;
}
public String getEmail() {
String email=null;
try {
email = attributes.get("userprincipalname").get(0).toString();
}catch (Exception e){
return null;
}
return email;
}
public String getDepartment() {
String department=null;
try{
department = attributes.get("department").get(0).toString();
}catch (Exception e){
return null;
}
return department;
}
public String getTitle(){
String title=null;
try{
title = attributes.get("title").get(0).toString();
}catch (Exception e){
return null;
}
return title;
}
public String getMobile(){
String mobile=null;
try{
mobile = attributes.get("mobile").get(0).toString();
}catch (Exception e){
return null;
}
return mobile;
}
public ArrayList<String> getOrganizations(){
String[] org=null;
ArrayList<String> OU = new ArrayList<String>();
String subString;
String headString=null;
String tailString =null;
String value;
try{
value = attributes.get("distinguishedname").get(0).toString();
org = value.split(",");
for (int i = 0; i < org.length; i++) {
headString = org[i].substring(0,3);
if(headString.equals("OU=")){
tailString = org[i].substring(3);
OU.add(tailString);
}
}
}catch (Exception e){
return null;
}
return OU;
}
}