请教一下,如何用JNDI访问MS Active Directory。
如查询AD中的用户,创建一新用户或修改用户口令等。

解决方案 »

  1.   

    最近也有这样的问题,还没有仔细看,在Google上找个例子应该就可以了,JNDI已经封装了很多东西了
      

  2.   

    自己装了个Active Directory,试了一下,搞定。
    但不能设置AD域用户的口令。代码如下,与大家分享。package com.faw_qm.ldap;/**
     * <p>Title: LDAP</p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2005.09.23</p>
     *
     * <p>Company: Faw_QM</p>
     *
     * @author Simon
     * @version 1.0
     */
    import javax.naming.*;
    import javax.naming.directory.*;
    import javax.naming.directory.SearchControls;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    import java.util.*;public class QueryAD {  public QueryAD() {
      }  public DirContext getContext() throws Exception {
        Hashtable table = new Hashtable();
        table.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        table.put(Context.PROVIDER_URL, "ldap://shf.com/");
        table.put("java.naming.ldap.version", "3");
        table.put(Context.REFERRAL, "follow");
        table.put(Context.SECURITY_AUTHENTICATION, "simple");
        table.put(Context.SECURITY_PRINCIPAL, "cn=Administrator,cn=Users,dc=shf,dc=com");
        table.put(Context.SECURITY_CREDENTIALS, "shf007");
        InitialDirContext cnt = new InitialDirContext(table);
        return cnt;
      }  public void query() throws Exception {
        
        String base = "cn=Users,dc=shf,dc=com";
        String[] atts = {"cn", "sAMAccountName", "DISPLAYName", "Description", "userPassword", "objectSID"};
        String filter = "objectClass=User";
        DirContext cnt = this.getContext();
        SearchControls searchCons = new SearchControls();
        NamingEnumeration namingEnum = null;
        searchCons.setSearchScope(2);
        searchCons.setCountLimit(0);
        searchCons.setTimeLimit(0);
        searchCons.setReturningAttributes(atts);
        namingEnum = cnt.search(base, filter, searchCons);
        print(namingEnum, base);  }  public void create() throws Exception {
        String userN = "Test01";
        String sn = "Shang";
        String givenName = "HaiFeng";
        //String dispName = "尚海峰";
        String name = "CN="+ userN +",CN=Users,dc=shf,dc=com";
        Object dobject = null;    BasicAttributes newUser = new BasicAttributes(false);
        newUser.put("objectClass", "top");
        newUser.put("objectClass", "person");
        newUser.put("objectClass", "organizationalperson");
        newUser.put("objectClass", "user");    //userAccountControl  --User valid
        newUser.put("sAMAccountName", userN);
        newUser.put("givenName", givenName);
        newUser.put("sn", sn);
        newUser.put("DISPLAYName", userN);
        newUser.put("description", userN);
        newUser.put("userAccountControl", "66048");
        newUser.put("userPassword", "123456");
        newUser.put("userPrincipalName", userN+"@shf.com");
        DirContext ctx = this.getContext();
        ctx.bind(name, dobject, newUser);
        System.out.println("Create Success..");
      }  public void modify() throws Exception {
        String name = "CN=Test01,CN=Users,dc=shf,dc=com";
        // Specify the changes to make
        ModificationItem[] mods = new ModificationItem[1];    // Replace the "mail" attribute with a new value
        mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("givenName", "Hello"));
        DirContext ctx = this.getContext();
        ctx.modifyAttributes(name, mods);
        System.out.println("Modify Success..");
      }  public void delete() throws Exception {
        String dn = "CN=Test01,CN=Users,dc=shf,dc=com";
        DirContext ctx = this.getContext();
        ctx.destroySubcontext(dn);
        System.out.println("Delete Success..");
      }  public void print(NamingEnumeration namingEnum, String base) throws Exception {
        while (namingEnum != null && namingEnum.hasMore()) {
          SearchResult result = (SearchResult) namingEnum.next();
          StringBuffer sb = new StringBuffer(result.getName());
          if (result.getName().length() > 0)
            sb.append(",");
          sb.append(base);
          String s1 = sb.toString();
          System.out.println("");
          System.out.println("DN =" + s1);
          Attributes attrs = result.getAttributes();
          if (attrs.size() == 0) {
            return;
          }
          else {
            for (NamingEnumeration namingEnum_1 = attrs.getAll();
                 namingEnum_1.hasMoreElements(); ) {
              Attribute attribute = (Attribute) namingEnum_1.next();
              String attID = attribute.getID();
              for (NamingEnumeration namingEnum_2 = attribute.getAll();
                   namingEnum_2.hasMoreElements(); ) {
                String s3 = "";
                Object attValue = namingEnum_2.nextElement();
                if (attValue instanceof String) {
                  s3 = (String) attValue;
                }
                else {
                  if (attValue instanceof byte[]) {
                    s3 = new String( (byte[]) attValue, "UTF8");
                  }
                  else {
                    s3 = new String("binary data");
                  }
                }
                System.out.println(attID+"= "+attValue);
              }        }
          }
        }  }  public static void main(String[] args) throws Exception {
        QueryAD tt = new QueryAD();
        tt.query();
        //tt.create();
        //tt.delete();
        //tt.modify();
      }}
      

  3.   

    有谁知道用Java设置AD域的用户口令,请贴出来。