JAvaアクセスADメモ
24236 ワード
注:以下の文字はすべてオリジナルではありませんて、大部分はネット上の达人の资料を参考にして、その时研究はリンクの住所を覚えていないで、コードは改造して、テストは合格します
1.仮想マシンwin 2003のインストール
2.win 2003ではOpad.txtで構成(jdkが必要)
OpAD.java-----------------------パスワードの変更
ADOperTest.java----------ADのユーザーの属性を得る
AuthenticationTest.java------ユーザー名パスワードの検証
Opad.txt:
ここでは簡単に構成手順を説明しますが、未説明の設定は基本的にデフォルトで行えます.
1)ADをインストールする:
開始->実行->dcpromote、dcpromo
ドメイン名:testad.com.cn
NTドメイン名:ldap
すなわちFully Qualified Domain Name(FQDN)はldap.testad.com.cn
注意、必ずIISをインストール、CAをインストールする.
2)IISを取り付ける:
スタート->プログラム->管理ツール->サーバの構成ウィザード->アプリケーションサーバ(IIS,ASP.NET)
http://ldap.testad.com.cn/iisstart.htmに入るとインストールに成功しました.
3)CAを取り付ける:
スタート->設定->コントロールパネル->プログラムの追加または削除->Windowsコンポーネントの追加/削除->証明書サービス
エンタープライズルートCAの選択
共通名CA:testca
http://ldap.testad.com.cn/CartSrvにアクセスすると、インストールに成功しました.
4)証明書リクエストの生成:
スタート->プログラム->管理ツール->インターネット情報サービス(IIS)マネージャ->インターネット情報サービス->Webサイト
-> 右クリックしてデフォルトのWebサイトを選択->プロパティ->ディレクトリセキュリティを選択->サーバ証明書を選択
->新しい証明書->証明書を準備しますが、後で送信します.
共通名はldap.testad.com.cnに設定することが望ましい.これはユーザにsslを接続するサイトである.
最後に証明書リクエストファイルが生成され、デフォルトはc:certreq.txt
5)CAで証明書を要求する:
http://ldap.testad.com.cn/CartSrvへ
証明書を1つ申請する->上級証明書申請
->base 64でエンコードされたCMCまたはPKCS#10ファイルを使用して証明書申請を発行するか、base 64でエンコードされたPKCS#7ファイルを使用して証明書申請を更新します.
メモ帳を使用してc:certreq.txtを開き、copy c:certreq.txtの内容を保存した申請に貼り付けます.
証明書テンプレートWebサーバを選択し、送信
次に、ダウンロード証明書をクリックし、certnew.cerをc:certnew.cerに保存します.
6)証明書のインストール:
スタート->プログラム->管理ツール->インターネット情報サービス(IIS)マネージャ->インターネット情報サービス->Webサイト
-> 右クリックしてデフォルトのWebサイトを選択->プロパティ->ディレクトリセキュリティを選択->サーバ証明書を選択
->保留中のリクエストの処理、証明書のインストール->パスとファイル名:c:certnew.cer
WebサイトSSLポート:443
7)CA証明書をkeystoreに追加する:
http://ldap.testad.com.cn/CartSrvへ
ポイント選択CA証明書、証明書チェーンまたはCRLをダウンロード
ポイントを選択してCA証明書をダウンロードし、c:ca_と名前を変更します.cert.cer
CAをインストールするとLDAPサーバCディスクルートディレクトリにldap.testad.com.cn_が生成されます.testca.crt
次に、コマンドを実行します.
keytool -import -keystore "c:/testca.keystore"-file "ldap.testad.com.cn_testca.crt"-storepass "changeit"
keytool -import -keystore "c:/testca.keystore"-alias mkey -file "c:/ca_cert.cer"-storepass "changeit"
Trusted this certificateが表示されますか?「y」を押すと新規作成に成功する.
しかし、個人的なテストを経てldap.testad.com.cn_を使用するだけです.testca.crtこの証明書はSSL AD 636に接続できます.
OpAD.java
ADOperTest.java
ADConnection.java
1.仮想マシンwin 2003のインストール
2.win 2003ではOpad.txtで構成(jdkが必要)
OpAD.java-----------------------パスワードの変更
ADOperTest.java----------ADのユーザーの属性を得る
AuthenticationTest.java------ユーザー名パスワードの検証
Opad.txt:
ここでは簡単に構成手順を説明しますが、未説明の設定は基本的にデフォルトで行えます.
1)ADをインストールする:
開始->実行->dcpromote、dcpromo
ドメイン名:testad.com.cn
NTドメイン名:ldap
すなわちFully Qualified Domain Name(FQDN)はldap.testad.com.cn
注意、必ずIISをインストール、CAをインストールする.
2)IISを取り付ける:
スタート->プログラム->管理ツール->サーバの構成ウィザード->アプリケーションサーバ(IIS,ASP.NET)
http://ldap.testad.com.cn/iisstart.htmに入るとインストールに成功しました.
3)CAを取り付ける:
スタート->設定->コントロールパネル->プログラムの追加または削除->Windowsコンポーネントの追加/削除->証明書サービス
エンタープライズルートCAの選択
共通名CA:testca
http://ldap.testad.com.cn/CartSrvにアクセスすると、インストールに成功しました.
4)証明書リクエストの生成:
スタート->プログラム->管理ツール->インターネット情報サービス(IIS)マネージャ->インターネット情報サービス->Webサイト
-> 右クリックしてデフォルトのWebサイトを選択->プロパティ->ディレクトリセキュリティを選択->サーバ証明書を選択
->新しい証明書->証明書を準備しますが、後で送信します.
共通名はldap.testad.com.cnに設定することが望ましい.これはユーザにsslを接続するサイトである.
最後に証明書リクエストファイルが生成され、デフォルトはc:certreq.txt
5)CAで証明書を要求する:
http://ldap.testad.com.cn/CartSrvへ
証明書を1つ申請する->上級証明書申請
->base 64でエンコードされたCMCまたはPKCS#10ファイルを使用して証明書申請を発行するか、base 64でエンコードされたPKCS#7ファイルを使用して証明書申請を更新します.
メモ帳を使用してc:certreq.txtを開き、copy c:certreq.txtの内容を保存した申請に貼り付けます.
証明書テンプレートWebサーバを選択し、送信
次に、ダウンロード証明書をクリックし、certnew.cerをc:certnew.cerに保存します.
6)証明書のインストール:
スタート->プログラム->管理ツール->インターネット情報サービス(IIS)マネージャ->インターネット情報サービス->Webサイト
-> 右クリックしてデフォルトのWebサイトを選択->プロパティ->ディレクトリセキュリティを選択->サーバ証明書を選択
->保留中のリクエストの処理、証明書のインストール->パスとファイル名:c:certnew.cer
WebサイトSSLポート:443
7)CA証明書をkeystoreに追加する:
http://ldap.testad.com.cn/CartSrvへ
ポイント選択CA証明書、証明書チェーンまたはCRLをダウンロード
ポイントを選択してCA証明書をダウンロードし、c:ca_と名前を変更します.cert.cer
CAをインストールするとLDAPサーバCディスクルートディレクトリにldap.testad.com.cn_が生成されます.testca.crt
次に、コマンドを実行します.
keytool -import -keystore "c:/testca.keystore"-file "ldap.testad.com.cn_testca.crt"-storepass "changeit"
keytool -import -keystore "c:/testca.keystore"-alias mkey -file "c:/ca_cert.cer"-storepass "changeit"
Trusted this certificateが表示されますか?「y」を押すと新規作成に成功する.
しかし、個人的なテストを経てldap.testad.com.cn_を使用するだけです.testca.crtこの証明書はSSL AD 636に接続できます.
OpAD.java
package com.dj.ad.test;
import java.io.UnsupportedEncodingException;
import java.util.Hashtable;
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.DirContext;
import javax.naming.directory.ModificationItem;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
public class OpAD {
private LdapContext ctx = null;
private String adminName = "[email protected]";
private String adminpassword = "nhm2010";
private String keystore = "C:/testca.keystore";
private String keyPassword = "123456";
private String ldapURL = "ldaps://192.168.1.29:636";
private String searchBase = "DC=demo,DC=com";
private String returnedAtts[] = { "distinguishedName" };
/**
*
*
* @return
*/
private boolean initial_Ldap() {
Hashtable env = new Hashtable();
System.setProperty("javax.net.ssl.trustStore", keystore);
System.setProperty("javax.net.ssl.trustStorePassword", keyPassword);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, adminName);
env.put(Context.SECURITY_CREDENTIALS, adminpassword);
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put(Context.PROVIDER_URL, ldapURL);
try {
System.out.println("Start InitialLdapContext");
ctx = new InitialLdapContext(env, null);
System.out.println("InitialLdapContext succeed");
} catch (NamingException e) {
System.out.println("Problem initial_Ldap NamingException: " + e);
return false;
}
return true;
}
private boolean close_Ldap() {
System.out.println("Close Ldap");
try {
ctx.close();
} catch (NamingException e) {
System.out.println("Problem close_Ldap NamingException: " + e);
return false;
}
return true;
}
/**
*
*
* @param username
* @return
*/
private String search_distinguishedName(String username) {
String searchFilter = "(&(objectClass=user)(cn=" + username + "))";
try {
System.out.println("Start search " + username
+ "'s distinguishedName");
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchCtls.setReturningAttributes(returnedAtts);
NamingEnumeration answer = ctx.search(searchBase, searchFilter,
searchCtls);
if (answer.hasMoreElements()) {
SearchResult sr = (SearchResult) answer.next();
Attributes attrs = sr.getAttributes();
if (attrs != null) {
NamingEnumeration ae = attrs.getAll();
Attribute attr = (Attribute) ae.next();
NamingEnumeration e = attr.getAll();
return (String) e.next();
}
}
} catch (NamingException e) {
System.out
.println("Problem search_distinguishedName NamingException: "
+ e);
return "error";
}
return "none";
}
/**
*
*
* @param username
* @param password
* @return
*/
private boolean mod_Pwd(String username, String password) {
ModificationItem[] mods = new ModificationItem[1];
String newQuotedPassword = "\"" + password + "\"";
try {
System.out.println("Start reset password");
byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
new BasicAttribute("unicodePwd", newUnicodePassword));
ctx.modifyAttributes(username, mods);
System.out.println("Finish reset password" + username);
} catch (UnsupportedEncodingException e) {
System.out.println("Problem mod_Pwd UnsupportedEncodingException: "
+ e);
return false;
} catch (NamingException e) {
System.out.println("Problem mod_Pwd NamingException: " + e);
return false;
}
return true;
}
public static void main(String args[]) {
OpAD inst = new OpAD();
inst.initial_Ldap();
String username = inst.search_distinguishedName("oyxiaoyuanxy");
System.out.println(username);
inst.mod_Pwd(username, "snewpsd");
inst.close_Ldap();
}
}
ADOperTest.java
package com.dj.ad.test;
import java.util.Hashtable;
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.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
public class ADOperTest {
public ADOperTest() {
}
public void GetADInfo() {
Hashtable HashEnv = new Hashtable();
String LDAP_URL = "ldap://192.168.1.29:389"; // LDAP
// String adminName ="CN=oyxiaoyuanxy,CN=Users,DC=Hebmc,DC=com";//AD
String adminName = "demo\\oyxy"; // :domain\User [email protected]
adminName = "[email protected]"; // :domain\User [email protected]
String adminPassword = "xiaoyuan"; //
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP
HashEnv.put(Context.SECURITY_PRINCIPAL, adminName); // AD User
HashEnv.put(Context.SECURITY_CREDENTIALS, adminPassword); // AD
// Password
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory"); // LDAP
HashEnv.put(Context.PROVIDER_URL, LDAP_URL);
try {
LdapContext ctx = new InitialLdapContext(HashEnv, null);
//
String searchBase = "DC=demo,DC=com"; // Specify the Base for the search
// LDAP
String searchFilter = "objectClass=User"; // specify the LDAP search filter
// String searchFilter = "objectClass=organizationalUnit";//specify the LDAP search filter
//
SearchControls searchCtls = new SearchControls(); // Create the search controls
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Specify the search scope
// searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE); // Specify the search scope
String returnedAtts[] = {"memberOf","distinguishedName","Pwd-Last-Set","User-Password","cn"};//
// String returnedAtts[] = { "url", "whenChanged", "employeeID",
// "name", "userPrincipalName", "physicalDeliveryOfficeName",
// "departmentNumber", "telephoneNumber", "homePhone",
// "mobile", "department", "sAMAccountName", "whenChanged",
// "mail" }; //
searchCtls.setReturningAttributes(returnedAtts); //
// 、 LDAP
NamingEnumeration answer = ctx.search(searchBase, searchFilter,
searchCtls);// Search for objects using the filter
// 0
int totalResults = 0;// Specify the attributes to return
int rows=0;
while (answer.hasMoreElements()) {//
SearchResult sr = (SearchResult) answer.next();// DN
System.out.println(++rows+"************************************************");
System.out.println(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++) {
System.out.println(" AttributeValues= :"+ e.next().toString());
}
System.out.println(" ---------------");
//
// Enumeration values = Attr.getAll();
// if (values != null) { //
// while (values.hasMoreElements()) {
//System.out.println(" AttributeValues= :"+ values.nextElement());
// }
// }
//System.out.println(" ---------------");
}
} catch (NamingException e) {
System.err.println("Throw Exception : " + e);
}
}
}
System.out.println("************************************************");
System.out.println("Number: " + totalResults);
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
System.err.println("Throw Exception : " + e);
}
}
public static void main(String args[]) {
ADOperTest ad = new ADOperTest();
ad.GetADInfo();
}
}
ADConnection.java
package com.dj.ad.test;
import java.security.Security;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
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;
/**
* java MS AD
*
* @author
*
*/
public class ADConnection {
DirContext ldapContext;
String baseName = ",cn=users,DC=demo,DC=com";
String serverIP = "192.168.1.29";
String modelUsername = "oyxiaoyuanxy";
public ADConnection() {
try {
Hashtable ldapEnv = new Hashtable(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
ldapEnv.put(Context.PROVIDER_URL, "ldaps://" + serverIP + ":636");
// ldapEnv.put(Context.PROVIDER_URL, "ldap://" + serverIP
// + ":389/dc=demo,dc=com");
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrator"
+ baseName);
ldapEnv.put(Context.SECURITY_CREDENTIALS, "nhm2010");
ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
ldapContext = new InitialDirContext(ldapEnv);
} catch (Exception e) {
System.out.println(" bind error: " + e);
e.printStackTrace();
System.exit(-1);
}
}
public void createNew(String username, String surname, String givenName) {
try {
String distinguishedName = "cn=" + username + baseName;
Attributes newAttributes = new BasicAttributes(true);
Attribute oc = new BasicAttribute("objectclass");
oc.add("top");
oc.add("person");
oc.add("organizationalperson");
oc.add("user");
newAttributes.put(oc);
newAttributes.put(new BasicAttribute("sAMAccountName", username));
/**
*
*/
String quotedPassword = "\"xiaoyuan\"";
byte[] newUnicodePassword = quotedPassword.getBytes("UTF-16LE");
newAttributes.put(new BasicAttribute("unicodePwd",
newUnicodePassword));
/**
* , ,
*/
int UF_ACCOUNTDISABLE = 0x0001;
int UF_PASSWD_NOTREQD = 0x0010;
int UF_NORMAL_ACCOUNT = 0x0200;
// int UF_PASSWORD_EXPIRED = 0x800000;
String str = Integer.toString(UF_NORMAL_ACCOUNT
+ UF_PASSWD_NOTREQD
// + UF_PASSWORD_EXPIRED
+ UF_ACCOUNTDISABLE);
newAttributes.put("userAccountControl", str);
newAttributes.put(new BasicAttribute("userPrincipalName", username
+ "@" + serverIP));
newAttributes.put(new BasicAttribute("cn", username));
newAttributes.put(new BasicAttribute("sn", surname));
newAttributes.put(new BasicAttribute("givenName", givenName));
newAttributes.put(new BasicAttribute("displayName", givenName + " "
+ surname));
System.out.println("Name: " + distinguishedName + " Attributes: "
+ newAttributes);
ldapContext.createSubcontext(distinguishedName, newAttributes);
} catch (Exception e) {
System.out.println("create error: " + e);
e.printStackTrace();
System.exit(-1);
}
}
/**
*
*
* @param username
* @param surname
* @param givenName
*/
public void createClone(String username, String surname, String givenName) {
try {
Attributes modelAttributes = fetch(modelUsername);
System.out.println("createClone:");
String distinguishedName = "cn=" + username + baseName;
Attributes newAttributes = new BasicAttributes(true);
newAttributes.put(modelAttributes.get("objectclass"));
// newAttributes.put(modelAttributes.get("userAccountControl"));
int UF_ACCOUNTDISABLE = 0x0002;
int UF_PASSWD_NOTREQD = 0x0020;
int UF_PASSWD_CANT_CHANGE = 0x0040;
int UF_NORMAL_ACCOUNT = 0x0200;
int UF_DONT_EXPIRE_PASSWD = 0x10000;
int UF_PASSWORD_EXPIRED = 0x800000;
String str = Integer.toString(UF_NORMAL_ACCOUNT + UF_PASSWD_NOTREQD
+ UF_PASSWORD_EXPIRED + UF_ACCOUNTDISABLE);
newAttributes.put("userAccountControl", str);
// newAttributes.put("userpassword", "\"xiaoyuan\"");
newAttributes.put("sAMAccountName", username);
newAttributes.put("userPrincipalName", username + "@" + serverIP);
newAttributes.put("cn", username);
newAttributes.put("sn", surname);
newAttributes.put("givenName", givenName);
newAttributes.put("displayName", givenName + " " + surname);
System.out.println("distinguishedName: " + distinguishedName
+ "
Attributes:
" + newAttributes);
ldapContext.createSubcontext(distinguishedName, newAttributes);
} catch (Exception e) {
System.err.println(" :
" + e);
e.printStackTrace();
System.exit(-1);
}
}
public void update(String username) {
try {
System.out.println("updating...
");
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
new BasicAttribute("description", "java y"));
ldapContext.modifyAttributes("cn=" + username + baseName, mods);
} catch (Exception e) {
System.out.println(" update error: " + e);
System.exit(-1);
}
}
public void updatePassword(String username, String password) {
try {
System.out.println("updating password...
");
String quotedPassword = "\"" + password + "\"";
/*
* char unicodePwd[] = quotedPassword.toCharArray(); byte pwdArray[] =
* new byte[unicodePwd.length * 2]; for (int i = 0; i <
* unicodePwd.length; i++) { pwdArray[i * 2 + 1] = (byte)
* (unicodePwd[i] >>> 8); pwdArray[i * 2 + 0] = (byte)
* (unicodePwd[i] & 0xff); } System.out.print("encoded password: ");
* for (int i = 0; i < pwdArray.length; i++) {
* System.out.print(pwdArray[i] + " "); } System.out.println();
* ModificationItem[] mods = new ModificationItem[1]; mods[0] = new
* ModificationItem(DirContext.REPLACE_ATTRIBUTE, new
* BasicAttribute("UnicodePwd", pwdArray));
* ldapContext.modifyAttributes("cn=" + username + baseName, mods);
*/
ModificationItem[] mods = new ModificationItem[1];
byte[] newUnicodePassword = quotedPassword.getBytes("UTF-16LE");
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
new BasicAttribute("unicodePwd", newUnicodePassword));
ldapContext.modifyAttributes("cn=" + username + baseName, mods);
} catch (Exception e) {
System.err.println(" :
" + e);
System.exit(-1);
}
}
/**
*
*
* @param username
* @return
*/
public Attributes fetch(String username) {
Attributes attributes = null;
String userDN = getUserDN(username);
System.out.println(" DN:" + userDN);
try {
System.out.println("fetching: " + username);
DirContext o = (DirContext) ldapContext.lookup(userDN);
System.out.println("search done
");
attributes = o.getAttributes("");
System.out.println("************************");
for (NamingEnumeration ae = attributes.getAll(); ae
.hasMoreElements();) {
Attribute attr = (Attribute) ae.next();
String attrId = attr.getID();
for (NamingEnumeration vals = attr.getAll(); vals.hasMore();) {
String thing = vals.next().toString();
System.out.println(attrId + ": " + thing);
}
}
System.out.println("************************");
} catch (Exception e) {
System.out.println(" fetch error: " + e);
System.exit(-1);
}
return attributes;
}
/**
* ID LDAP DN
*
* @param userid
* @return
*/
private String getUserDN(String userid) {
System.out.println("getUserDN:" + userid);
String userDN = "";
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(objectClass=user)(CN=" + userid + "))";
NamingEnumeration en = ldapContext.search("dc=demo,dc=com", filter,
constraints);
if (en == null) {
System.out.println("Have NO such user!");
}
if (!en.hasMoreElements()) {
System.out.println("Have NO such user!");
}
while (en != null && en.hasMoreElements()) {
Object obj = en.nextElement();
if (obj instanceof SearchResult) {
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + "dc=demo,dc=com";
} else {
System.out.println(obj);
}
}
} catch (Exception e) {
System.out.println("Exception in search user DN : " + e.toString());
}
return userDN;
}
public static void main(String[] args) {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
// the keystore that holds trusted root certificates
System.setProperty("javax.net.ssl.trustStore",
"C:/Java/jdk1.6.0_12/bin/testca.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
// System.setProperty("javax.net.debug", "all");
ADConnection adc = new ADConnection();
// adc.createClone("clone1", "Clone", "Clarissa");
// adc.updatePassword("clone1", "xiaoyuan");
adc.createNew("user1", "User", "Joe");
// Attributes a = adc.fetch("clone1");
}
}