JAVA使用LDAP修改windows Active Directory 域用户密码
作者:廖武锋
MSN:liaowufeng1111@hotmail.com
QQ: 38773367
email: moaihe1111@163.com 本人为作者原创,若转贴,请保留作者署名,谢谢! 1 注意: 1. LDAP 无法获取windows Active Directory 用户密码 2. 系统管理员可以修改其他用户的密码(不需要知道原来的旧密码),或者用户可以修改自己的密码(用户必须知道自己的密码)。这些密码修改操作必须通过一个安全通道来执行,象SSL、TLS、Kerberos。 3. Windows 2000 域控制器不支持TLS协议。但是Windows 2000 和 Windows Server 2003 域控制器都支持SSL。对基于SSL或TLS的会话,你的工作站(或指定的JRE)必须信任域控制器认证中心发布的CA证书。
相关资料可到www.ldapchina.com网站在看
具体步骤如下: 环境要求: 一台安装Active Directory 的服务器,域名为security.boco 一台安装证书服务(需安装企业根证书)的服务器,此服务器加入security域中 一台安装JAVA应用的服务器,此服务器不需要加入security域中 安装步骤: 1 安装Active Directory 域控制器 2 安装证书服务 3 以域用户登录到安装了证书服务的服务器中,导出域根证书和计算机证书 第一步:进入MMC控制台,添加证书,选择本地计算机
 进入MMC 控制台

添加证书管理单元,选择本地计算机
第二步展开刚增加的证书节点,选择证书个人->证书,选择CA证书,导出

第三步展开证书节点,选择证书个人证书 ,右击所有任务,申请新证书,证书类型选择计算机类型


4 将从证书中导出的两个证书文件,*.cer 使用java的keytool工具创建或导入证书库文件中
导入CA证书 D:\Borland\jdk142_05\bin>keytool -import -keystore security51.keystore -file 51A Droot.cer 输入keystore密码: lwfmah Owner: CN=securityCA, DC=security, DC=boco 发照者: CN=securityCA, DC=security, DC=boco 序号: 72880fb3005cd7a54efa9c224241008b 有效期间: Thu Nov 10 20:48:49 CST 2005 至: Tue Nov 10 20:55:33 CST 2015 认证指纹: MD5: 51:3F:C3:B1:C3:A6:EF:24:55:70:2A:25:0D:EB:57:59 SHA1: B3:EE:CC:92:E3:D4:87:48:D4:1D:F3:53:5B:0E:99:E1:B7:0F:27:20 信任这个认证? [否]: y 认证已添加至keystore中
导入申请的计算机证书 D:\Borland\jdk142_05\bin>keytool -import -keystore security51.keystore -alias co mkey -file 51AD.cer 输入keystore密码: lwfmah 认证已添加至keystore中
5 编写如下代码修改Active Direcotry 域用户密码
-
- public static void main(String[] args) throws UnknownHostException,
- IOException {
- // java.net.Socket sock = new java.net.Socket("10.110.180.50",636);
- // boolean b = sock.isConnected();
- Hashtable env = new Hashtable();
- String adminName = "cn=administrator,cn=users,DC=security,DC=boco";
- String adminpassword = "123456789";
- String userName = "CN=iam_lwf_count,OU=网管中心,DC=security,DC=boco";
- // old password Ab123456
- String newPassword = "liaowufeng";
- String keystore = "D:/Borland/jdk142_05/bin/security51.keystore";
- // String keystore = "E:/project/iam/testADlhj.keystore";
- System.setProperty("javax.net.ssl.trustStore", keystore);
- System.setProperty("javax.net.ssl.trustStorePassword", "lwfmah");
- 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");
- String ldapURL = "ldaps://10.110.180.50:636";
- env.put(Context.PROVIDER_URL, ldapURL);
- try {
- LdapContext ctx = new InitialLdapContext(env, null);
- ModificationItem[] mods = new ModificationItem[1];
- String newQuotedPassword = "\"" + newPassword + "\"";
- byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");
- mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,new BasicAttribute("unicodePwd",newUnicodePassword));
- ctx.modifyAttributes(userName, mods);
- System.out.println("Reset Password for: " + userName);
- ctx.close();
- System.out.println("Problem encoding password222: ");
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("Problem encoding password222: " + e);
- }
- }
还有什么不明白或者实践碰到什么问题,欢迎加我共同进步.
|
|