如何从Active Directory中读取用户数据

##  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;
    }

 }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值