通过JNDI访问MS Active Directory 请教一下,如何用JNDI访问MS Active Directory。如查询AD中的用户,创建一新用户或修改用户口令等。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最近也有这样的问题,还没有仔细看,在Google上找个例子应该就可以了,JNDI已经封装了很多东西了 自己装了个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(); }} 有谁知道用Java设置AD域的用户口令,请贴出来。 java \r \n 区别 Java判断鼠标位置 这段程序的输出? JTable的右键事件如何实现 拷贝非文本文件有问题 一个简单的GUI问题,帮忙解决一下 QQ群号4527614 关于传值和传引用的问题,请大家来看一下。 如何处理客户机和服务器使用不同字符集(包括双字节字符)上传或下载文件时文件名的转换问题 J2SE的迷茫 问个菜鸟问题,关于加载图片,多多指教 画线问题,快进来吧!!
但不能设置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();
}}