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