使用java JNDI更新active directory数据信息?

使用java JNDI更新active directory数据信息?,java,active-directory,ldap,jndi,Java,Active Directory,Ldap,Jndi,我想使用java JNDI更新/插入Active directory中可用或不可用的用户信息。我已经创建了一个应用程序,允许Active Directory用户获取他们的信息,并且我能够从Active Directory中提取数据,但是我不知道如何使用用户想要更新的jndi Java将数据保存在Active Directory中 ctx.modifyAttributes(unique_name,iteam); 使用此方法可以更新active directory中的记录。名称表示searchb

我想使用java JNDI更新/插入Active directory中可用或不可用的用户信息。我已经创建了一个应用程序,允许Active Directory用户获取他们的信息,并且我能够从Active Directory中提取数据,但是我不知道如何使用用户想要更新的jndi Java将数据保存在Active Directory中

ctx.modifyAttributes(unique_name,iteam); 
使用此方法可以更新active directory中的记录。名称表示searchbase和搜索筛选器的组合,使数据在ldap active directory中唯一

ModificationItem[] iteam = new ModificationItem[number_of_attribute_you_want_to_update];
iteam是您将要执行的一系列更改

Attribute name = new BasicAttribute("displayName",userDetail.getName());
// replacing the value
    item[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, name);
设置值

完成----- 下面给出了一个工作示例 包com.ma.util

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Properties;
import java.util.logging.Logger;
import javax.naming.directory.*;
 import javax.naming.AuthenticationException; 
 import javax.naming.AuthenticationNotSupportedException;
 import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.LdapContext;
import javax.security.auth.login.AppConfigurationEntry;
import javax.xml.transform.ErrorListener;

import com.ma.model.AppUserToAD;
import com.ma.model.Non_GAppUserFromAD;
import com.ma.properties.Params;

public class ActiveDirectoryConnectionWpToAd {

// connect the application with the active directory

public DirContext superUserContext;
public LdapContext ctx;
public static DirContext UserContext;

public ActiveDirectoryConnectionWpToAd() {
    // initialization parameters
    UserContext = getConnect();
}

public DirContext getConnect() {

    Hashtable<String, Object> env = new Hashtable<String, Object>();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");

    env.put(Context.PROVIDER_URL, <ipaddress:port>);
    env.put(Context.SECURITY_PRINCIPAL, <ldap user>);
    env.put(Context.SECURITY_CREDENTIALS, <ldap password>);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");

    env.put("java.naming.ldap.attributes.binary", "objectSID objectGUID");
    try {
        superUserContext = new InitialDirContext(env);

        System.out.println("connected");
        System.out.println(superUserContext.getEnvironment().toString());

    } catch (AuthenticationNotSupportedException ex) {
        System.out.println("The authentication is not supported by the server");
    } catch (AuthenticationException ex) {
        System.out.println("incorrect password or username");
    } catch (NamingException ex) {
        System.out.println("error when trying to create the context" + ex);
    }
    return superUserContext;

}

   // this method setUserInfo
   public void setUserInfo(DirContext ctx, String searchBase,
        String searchFilter) throws NamingException {

    SearchResult sourceResult = null;
    // Create the search controls
    SearchControls searchCtls = new SearchControls();

    // Specify the attributes to return
    searchCtls.setReturningAttributes("cn,sn,objectGUID,telephoneNumber");
    System.out.println("Specify the attributes to return ");

    // Specify the search scope
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    System.out.println(" Specify the search scope ");
    NamingEnumeration<SearchResult> answer = ctx.search(searchBase,
            searchFilter, searchCtls);

    System.out.println(answer);

    sourceResult = (SearchResult) answer.next();
    Attributes attrs = sourceResult.getAttributes();
    System.out.println("name : " + attrs.get("cn").get());

    if (answer.hasMore()) {
        sourceResult = (SearchResult) answer.next();

        Attributes attrs1 = sourceResult.getAttributes();
        System.out.println("name : " + attrs1.get("cn").get());
        // System.out.println("name 2 : "+attrs2.get("cn").get());
        System.out.println("telephoneNumber : "
                + attrs1.get("telephoneNumber").get());
    }
    // updating the record
    Attribute attribute = new BasicAttribute("telephoneNumber",
            "8285427147");
    // array of modified iteams
    ModificationItem[] item = new ModificationItem[1];
    // replacing the value
    item[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attribute);
    // changing the value of the attribute
    ctx.modifyAttributes(
            "CN=<somevalue> ,OU= <somevalue> Contacts,DC=<somevalue>,DC=<some value>",
            item);

    System.out.println("telephoneNumber : "+    attrs.get("telephoneNumber").get());

}

// convert the attribute data into the string
    public String convertDataIntoString(Attributes attrs, String name) {
    String output = "";
    if (attrs.get(name) != null) {
        try {
            output = (String) attrs.get(name).get();
        } catch (Exception e) {
            System.out.println("Exception In : " + attrs.get("cn"));
            e.toString();
        }

    } else {
        output = "";
    }
    return output;

}

// convert the objectGUID into the byteString
public static String getObjectGUIDString(Attributes attrs)
        throws NamingException {

    byte[] GUID = (byte[]) attrs.get("objectGUID").get();
    // String strGUID = "";
    String byteGUID = "";

    // Convert the GUID into string using the byte format
    for (int c = 0; c < GUID.length; c++) {
        byteGUID = byteGUID + "\\\\" + AddLeadingZero((int) GUID[c] & 0xFF);
    }

    // specify the LDAP search filter
    // This is the binary format of the objectGUID
    // Note that I've escaped the '\' character
    /*
     * String searchFilter ="(objectGUID=\\67\\8a\\44\\7c\\3b\\92\\ee\\48\\b2\\1a\\34\\51\\f2\\f7\\58\\ca)";
     */

    return byteGUID;
}

static String AddLeadingZero(int k) {
    return (k < 0xF) ? "0" + Integer.toHexString(k) : Integer
            .toHexString(k);
}


// this method setUserInfo

    public void setUserInfo(String searchBase,String searchFilter, Non_GAppUserFromAD userDetail) throws NamingException {
    SearchResult sourceResult = null;
    NamingEnumeration<SearchResult> answer=null ;
    // Create the search controls
    SearchControls searchCtls = new SearchControls();
    if (userDetail == null) {
        return;
    } else {

        // Specify the attributes to return
        searchCtls.setReturningAttributes(Params.RETURNED_ATTRIBUTES);
        System.out.println("Specify the attributes to return ");

        // Specify the search scope
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        System.out.println(" Specify the search scope ");
    //  NamingEnumeration<SearchResult> answer = ctx.search(searchBase,searchFilter, searchCtls);

        System.out.println("Search Filter : "+ searchFilter);
         answer = UserContext.search(searchBase,searchFilter, searchCtls);

        System.out.println("-------------------------"+answer);

        sourceResult = (SearchResult) answer.next();
        Attributes attrs = sourceResult.getAttributes();
        System.out.println("name : " + attrs.get("cn").get());


    // updating the record

        userDetail.getName();
        userDetail.getSurName();
        userDetail.getUserId();

    System.out.println( userDetail.toString());

        //assign the value to the attribute  fields 

        Attribute name = new BasicAttribute("displayName",userDetail.getName());
        Attribute surName = new BasicAttribute("sn",userDetail.getSurName());





        // array of modified iteams

        ModificationItem[] item = new ModificationItem[10];
        // replacing the value

        item[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,name);
        item[1] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,surName);



        // changing the value of the attribute
        String cnValue = attrs.get("CN").toString();
    String cnValueRp = cnValue.replace(':', '=');

        try {

            UserContext.modifyAttributes(cnValueRp+","+searchBase, item);

        } catch (NamingException e) {
            e.printStackTrace();
        }



       }

    }
}
import java.util.ArrayList;
导入java.util.Hashtable;
导入java.util.Properties;
导入java.util.logging.Logger;
导入javax.naming.directory.*;
导入javax.naming.AuthenticationException;
导入javax.naming.AuthenticationNotSupportedException;
导入javax.naming.Context;
导入javax.naming.NamingEnumeration;
导入javax.naming.NamingException;
导入javax.naming.directory.Attributes;
导入javax.naming.directory.DirContext;
导入javax.naming.directory.InitialDirContext;
导入javax.naming.directory.SearchControls;
导入javax.naming.directory.SearchResult;
导入javax.naming.ldap.LdapContext;
导入javax.security.auth.login.AppConfigurationEntry;
导入javax.xml.transform.ErrorListener;
导入com.ma.model.AppUserToAD;
导入com.ma.model.Non_GAppUserFromAD;
导入com.ma.properties.Params;
公共类ActiveDirectoryConnectionWpToAd{
//将应用程序与active directory连接
公共目录上下文超级用户上下文;
公共LdapContext ctx;
公共静态DirContext用户上下文;
public-ActiveDirectoryConnectionWpToAd(){
//初始化参数
UserContext=getConnect();
}
公共目录上下文getConnect(){
Hashtable env=新的Hashtable();
环境放置(Context.INITIAL\u Context\u工厂,
“com.sun.jndi.ldap.LdapCtxFactory”);
put(Context.PROVIDER_URL,);
环境保护(Context.SECURITY_PRINCIPAL,);
环境保护(Context.SECURITY_凭证,);
环境put(Context.SECURITY_认证,“simple”);
put(“java.naming.ldap.attributes.binary”、“objectSID objectGUID”);
试一试{
superUserContext=新的InitialDirContext(env);
System.out.println(“已连接”);
System.out.println(superUserContext.getEnvironment().toString());
}捕获(AuthenticationNotSupportedException ex){
System.out.println(“服务器不支持身份验证”);
}捕获(AuthenticationException ex){
System.out.println(“不正确的密码或用户名”);
}捕获(NamingException-ex){
System.out.println(“尝试创建上下文时出错”+ex);
}
返回超级用户上下文;
}
//此方法使用setUserInfo
public void setUserInfo(DirContext ctx、String searchBase、,
字符串搜索筛选器)引发NamingException{
SearchResult sourceResult=null;
//创建搜索控件
SearchControls searchCtls=新的SearchControls();
//指定要返回的属性
searchCtls.SetReturningAttribute(“cn、sn、objectGUID、电话号码”);
System.out.println(“指定要返回的属性”);
//指定搜索范围
searchCtls.setSearchScope(SearchControls.SUBTREE_范围);
System.out.println(“指定搜索范围”);
NamingEnumeration answer=ctx.search(searchBase,
searchFilter,searchCtls);
System.out.println(应答);
sourceResult=(SearchResult)answer.next();
Attributes attrs=sourceResult.getAttributes();
System.out.println(“名称:”+attrs.get(“cn”).get();
if(answer.hasMore()){
sourceResult=(SearchResult)answer.next();
Attributes attrs1=sourceResult.getAttributes();
System.out.println(“名称:+attrs1.get(“cn”).get());
//System.out.println(“名称2:+attrs2.get(“cn”).get());
System.out.println(“电话号码:
+attrs1.get(“电话号码”).get();
}
//更新记录
属性=新的基本属性(“电话号码”,
"8285427147");
//改进的iteams阵列
ModificationItem[]项=新的ModificationItem[1];
//替换值
项[0]=新修改项(DirContext.REPLACE_属性,属性);
//更改属性的值
ctx.modifyAttributes(
“CN=,OU=联系人,DC=,DC=”,
项目);
System.out.println(“电话号码:”+attrs.get(“电话号码”).get();
}
//将属性数据转换为字符串
公共字符串convertDataIntoString(属性属性属性、字符串名称){
字符串输出=”;
if(attrs.get(name)!=null){
试一试{
output=(字符串)attrs.get(name.get();
}捕获(例外e){
System.out.println(“异常输入:”+attrs.get(“cn”);
e、 toString();
}
}否则{
输出=”;
}
返回输出;
}
//将objectGUID转换为byteString
公共静态字符串getObjectGUIDString(属性属性属性)
抛出NamingException{
字节[]GUID=(字节[])attrs.get(“objectGUID”).get();
//字符串strGUID=“”;
字符串byteGUID=“”;
//使用字节格式将GUID转换为字符串
for(int c=0;c