java连接微软AD(LDAP)

本文提供了一段使用Java连接并搜索微软Active Directory(AD)的示例代码,通过LDAP协议实现。代码中展示了如何设置连接参数、搜索用户以及获取特定属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.abc;

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 test2 {
    public static void main(String args[]) {
        Hashtable<String, String> HashEnv = new Hashtable<String, String>();
        String baseName = ",cn=users,dc=abc,dc=com";
        String LDAP_URL = "ldap://10.254.xxx.xxx:389"; //LDAP访问地址
        String adminName = "cn=administrator" + baseName; //注意用户名的写法
        String adminPassword = "abc123"; //密码

        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, LDAP_URL);

        try {
          LdapContext ctx = new InitialLdapContext(HashEnv, null);
          SearchControls searchCtls = new SearchControls(); //Create the search controls
          searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); //Specify the search scope

          String searchFilter = "objectClass=User"; //specify the LDAP search filter
        
          String searchBase = "dc=cmdi,dc=chinamobile,dc=com"; //Specify the Base for the search//搜索域节点
          int totalResults = 0;

               String returnedAtts[] = {
              "cn", "displayName", "distinguishedName","name", "primaryGroupID",
              "pwdLastSet", "sAMAccountName", "sAMAccountType","sn","givenName",
              "userAccountControl", "userPrincipalName", "whenChanged", "whenCreated"}; //定制返回属性

          searchCtls.setReturningAttributes(returnedAtts); //设置返回属性集

          //Search for objects using the filter
          NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls);
          
          if(answer==null||answer.equals(null)){
           System.out.println("answer is null");
          }else{
           System.out.println("answer not null");
          }
          
          System.out.println(answer.hasMoreElements());
          
          while (answer.hasMoreElements()) {
            SearchResult sr = (SearchResult) answer.next();
            System.out.println("************************************************");
            System.out.println(sr.getName());

            Attributes Attrs = sr.getAttributes();
            if (Attrs != null) {
              try {
                for (NamingEnumeration<? extends Attribute> 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++) {
                    System.out.println("    AttributeValues=" + e.next().toString());
                  }
                  System.out.println("    ---------------");

                  //读取属性值
                  NamingEnumeration<?> values = Attr.getAll();
                  if (values != null) { // 迭代
                    while (values.hasMoreElements()) {
                      System.out.println("    AttributeValues=" + values.nextElement());
                    }
                  }
                  System.out.println("    ---------------");
                }
              }
              catch (NamingException e) {
                System.err.println("Throw Exception : " + e);
              }
            }
          }
          System.out.println("Number: " + totalResults);
          ctx.close();
        }

        catch (NamingException e) {
          e.printStackTrace();
          System.err.println("Throw Exception : " + e);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值