JAvaアクセスADメモ


注:以下の文字はすべてオリジナルではありませんて、大部分はネット上の达人の资料を参考にして、その时研究はリンクの住所を覚えていないで、コードは改造して、テストは合格します
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"); } }