zoukankan      html  css  js  c++  java
  • Java通过Ldap操作AD的增删改查询

    package com.smnpc.util;
    import java.util.Hashtable;
    import java.util.Vector;
    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.BasicAttribute;
    import javax.naming.directory.BasicAttributes;
    import javax.naming.directory.DirContext;
    import javax.naming.directory.InitialDirContext;
    import javax.naming.directory.ModificationItem;
    import javax.naming.directory.SearchControls;
    import javax.naming.directory.SearchResult;
    import javax.naming.ldap.LdapContext;
    
    /**
    * Java通过Ldap操作AD的增删该查询
    * @author guob
    */
    
    public class LdapbyUser {
    DirContext dc = null;
    String root = "dc=example,dc=com"; // LDAP的根节点的DC
    
    /**
    * 
    * @param dn类似于"CN=RyanHanson,dc=example,dc=com"
    * @param employeeID是Ad的一个员工号属性
    */
    public LdapbyUser(String dn,String employeeID) {
    init();
    // add();//添加节点
    // delete("ou=hi,dc=example,dc=com");//删除"ou=hi,dc=example,dc=com"节点
    // renameEntry("ou=new,o=neworganization,dc=example,dc=com","ou=neworganizationalUnit,o=neworganization,dc=example,dc=com");//重命名节点"ou=new,o=neworganization,dc=example,dc=com"
    // searchInformation("dc=example,dc=com", "", "sAMAccountName=guob");//遍历所有根节点
    modifyInformation(dn,employeeID);//修改
    // Ldapbyuserinfo("guob");//遍历指定节点的分节点
    close();
    }
    
    /**
    * 
    * Ldap连接
    * 
    * @return LdapContext
    */
    public void init() {
    Hashtable env = new Hashtable();
    String LDAP_URL = "ldap://xxxx:389"; // LDAP访问地址
    String adminName = "example\user"; // 注意用户名的写法:domainUser或
    String adminPassword = "userpassword"; // 密码
    env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, LDAP_URL);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, adminName);
    env.put(Context.SECURITY_CREDENTIALS, adminPassword);
    try {
    dc = new InitialDirContext(env);// 初始化上下文
    System.out.println("认证成功");// 这里可以改成异常抛出。
    } catch (javax.naming.AuthenticationException e) {
    System.out.println("认证失败");
    } catch (Exception e) {
    System.out.println("认证出错:" + e);
    }
    }
    
    /**
    * 添加
    */
    public void add(String newUserName) {
    try {
    BasicAttributes attrs = new BasicAttributes();
    BasicAttribute objclassSet = new BasicAttribute("objectClass");
    objclassSet.add("sAMAccountName");
    objclassSet.add("employeeID");
    attrs.put(objclassSet);
    attrs.put("ou", newUserName);
    dc.createSubcontext("ou=" + newUserName + "," + root, attrs);
    } catch (Exception e) {
    e.printStackTrace();
    System.out.println("Exception in add():" + e);
    }
    }
    
    /**
    * 删除
    * 
    * @param dn
    */
    public void delete(String dn) {
    try {
    dc.destroySubcontext(dn);
    } catch (Exception e) {
    e.printStackTrace();
    System.out.println("Exception in delete():" + e);
    }
    }
    
    /**
    * 重命名节点
    * 
    * @param oldDN
    * @param newDN
    * @return
    */
    public boolean renameEntry(String oldDN, String newDN) {
    try {
    dc.rename(oldDN, newDN);
    return true;
    } catch (NamingException ne) {
    System.err.println("Error: " + ne.getMessage());
    return false;
    }
    }
    
    /**
    * 修改
    * 
    * @return
    */
    public boolean modifyInformation(String dn,String employeeID) {
    try {
    System.out.println("updating...
    ");
    ModificationItem[] mods = new ModificationItem[1];
    /* 修改属性 */
    // Attribute attr0 = new BasicAttribute("employeeID", "W20110972");
    // mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr0);
    
    /* 删除属性 */
    // Attribute attr0 = new BasicAttribute("description",
    // "陈轶");
    // mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
    // attr0);
    
    /* 添加属性 */
    Attribute attr0 = new BasicAttribute("employeeID",employeeID);
    mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);
    /* 修改属性 */
    dc.modifyAttributes(dn+",dc=example,dc=com", mods);
    return true;
    } catch (NamingException e) {
    e.printStackTrace();
    System.err.println("Error: " + e.getMessage());
    return false;
    }
    }
    
    /**
    * 关闭Ldap连接
    */
    public void close() {
    if (dc != null) {
    try {
    dc.close();
    } catch (NamingException e) {
    System.out.println("NamingException in close():" + e);
    }
    }
    }
    
    /**
    * @param base :根节点(在这里是"dc=example,dc=com")
    * @param scope :搜索范围,分为"base"(本节点),"one"(单层),""(遍历)
    * @param filter :指定子节点(格式为"(objectclass=*)",*是指全部,你也可以指定某一特定类型的树节点)
    */
    public void searchInformation(String base, String scope, String filter) {
    SearchControls sc = new SearchControls();
    if (scope.equals("base")) {
    sc.setSearchScope(SearchControls.OBJECT_SCOPE);
    } else if (scope.equals("one")) {
    sc.setSearchScope(SearchControls.ONELEVEL_SCOPE);
    } else {
    sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
    }
    NamingEnumeration ne = null;
    try {
    ne = dc.search(base, filter, sc);
    // Use the NamingEnumeration object to cycle through
    // the result set.
    while (ne.hasMore()) {
    System.out.println();
    SearchResult sr = (SearchResult) ne.next();
    String name = sr.getName();
    if (base != null && !base.equals("")) {
    System.out.println("entry: " + name + "," + base);
    } else {
    System.out.println("entry: " + name);
    }
    
    Attributes at = sr.getAttributes();
    NamingEnumeration ane = at.getAll();
    while (ane.hasMore()) {
    Attribute attr = (Attribute) ane.next();
    String attrType = attr.getID();
    NamingEnumeration values = attr.getAll();
    Vector vals = new Vector();
    // Another NamingEnumeration object, this time
    // to iterate through attribute values.
    while (values.hasMore()) {
    Object oneVal = values.nextElement();
    if (oneVal instanceof String) {
    System.out.println(attrType + ": " + (String) oneVal);
    } else {
    System.out.println(attrType + ": " + new String((byte[]) oneVal));
    }
    }
    }
    }
    } catch (Exception nex) {
    System.err.println("Error: " + nex.getMessage());
    nex.printStackTrace();
    }
    }
    /**
    * 查询
    * 
    * @throws NamingException
    */
    public void Ldapbyuserinfo(String userName) {
    // Create the search controls
    SearchControls searchCtls = new SearchControls();
    // Specify the search scope
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    // specify the LDAP search filter
    String searchFilter = "sAMAccountName=" + userName;
    // Specify the Base for the search 搜索域节点
    String searchBase = "DC=example,DC=COM";
    int totalResults = 0;
    String returnedAtts[] = { "url", "whenChanged", "employeeID", "name",
    "userPrincipalName", "physicalDeliveryOfficeName",
    "departmentNumber", "telephoneNumber", "homePhone", "mobile",
    "department", "sAMAccountName", "whenChanged", "mail" }; // 定制返回属性
    
    searchCtls.setReturningAttributes(returnedAtts); // 设置返回属性集
    
    // searchCtls.setReturningAttributes(null); // 不定制属性,将返回所有的属性集
    
    try {
    NamingEnumeration answer = dc.search(searchBase, searchFilter,
    searchCtls);
    if (answer == null || answer.equals(null)) {
    System.out.println("answer is null");
    } else {
    System.out.println("answer not null");
    }
    while (answer.hasMoreElements()) {
    SearchResult sr = (SearchResult) answer.next();
    System.out
    .println("************************************************");
    System.out.println("getname=" + sr.getName());
    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++) {
    String user = e.next().toString(); // 接受循环遍历读取的userPrincipalName用户属性
    System.out.println(user);
    }
    // System.out.println(" ---------------");
    // // 读取属性值
    // Enumeration values = Attr.getAll();
    // if (values != null) { // 迭代
    // while (values.hasMoreElements()) {
    // System.out.println(" 2AttributeValues="
    // + values.nextElement());
    // }
    // }
    // System.out.println(" ---------------");
    }
    } catch (NamingException e) {
    System.err.println("Throw Exception : " + e);
    }
    }
    }
    System.out.println("Number: " + totalResults);
    } catch (Exception e) {
    e.printStackTrace();
    System.err.println("Throw Exception : " + e);
    }
    }
    
    /**
    * 主函数用于测试
    * @param args
    */
    public static void main(String[] args) {
    new LdapbyUser("CN=RyanHanson","bbs.it-home.org");
    }
    }
    

  • 相关阅读:
    lines-HDU5124(区间处理 +离散化)
    Reorder the Books-HDU5500
    Bad Hair Day-POJ3250(简单的入栈出栈)
    Count the Colors-ZOJ1610(线段树区间求)
    Just a Hook-HDU1698(线段树求区间)
    Mayor's posters-POJ2528(线段树+离散化)
    A Simple Problem with Integers-POJ3468
    Strongly connected-HDU4635
    Caocao's Bridges-HDU4738(Tarjin+求桥)
    Warm up-HUD4612(树的直径+Tarjin缩点)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318071.html
Copyright © 2011-2022 走看看