设为首页 收藏本站
查看: 1185|回复: 0

[经验分享] Sun LDAP 5.2 迁移 Windows 2008 Active Directory(AD)方案

[复制链接]

尚未签到

发表于 2016-5-22 10:46:12 | 显示全部楼层 |阅读模式
  由于业务需要,近期做了个LDAP迁移WIN AD的方案,到网上查了很多资料,发现利用java无法往AD里写入用户密码以及自定义的字段。经过咨询microsoft的工程师,得到如下结论:
  1、如果要往AD写用户密码,只能通过.net或者微软提供的接口。
  2、要扩展AD的自定义属性,或者元素,通过注册Schmmgmt.dll,管理AD的架构。(注册方法:开始-->运行-->cmd-->确定-->regsvr32 Schmmgmt.dll.dll
  
  具体操作方法如下:
  
  一、首先定义自定义的属性(前提是已经注册好了Schmmgmt.dll.dll):
  
  开始-->运行-->mmc-->确定
  
  此时会弹出一个控制台,继续如下操作
  
  文件-->添加管理单元-->Active Directory 架构-->添加-->确定
  
  此时,展开MMC控制台最左边的的 Active Directory 架构树
  右键点击属性-->新建-->属性-->继续 (以下是你自己需要的属性内容)
  
  最后一步操作,展开类,将你新建的属性关联到类。
  
  二、通过程序连接LDAP(我用的是JLDAP,当然,你可以用别的方式,网上资料很多,可以查查),伪代码如下:
  
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPSearchResults;
  import com.novell.ldap.LDAPEntry;
  
  
  
  String LDAP_Ip = "10.10.159.59";
  int LDAP_port = 389;
  LDAPConnection con = new LDAPConnection();
  con.connect(LDAP_Ip , LDAP_port);
  con.bind(LDAPConnection.LDAP_V3, "cn=directory manager","11111111");
  LDAPSearchResults rs = con.search("ou=People,dc=test,dc=com",
  LDAPConnection.SCOPE_SUB, "objectClass=*", null, false);
  
  
  别忘了操作完了断开连接释放资源。
  
  三、将查询到的数据写入AD(伪代码如下):
  
  LDAPConnection con = new LDAPConnection();
  con.connect("10.10.159.86", 389);
  //连接AD时要注意,它的用户名为 登陆账户@域名
  con.bind(LDAPConnection.LDAP_V3, "Administrator@test.com","pa$$word");
  
  ...获取LDAP的数据略
  
  //以下是存储方法
  
  LDAPAttributeSet attributeSet = new LDAPAttributeSet();
  attributeSet.add(new LDAPAttribute("objectclass", new String("user")));
  attributeSet.add(new LDAPAttribute("objectclass", new String("top")));
  attributeSet.add(new LDAPAttribute("objectclass", new String("person")));
  attributeSet.add(new LDAPAttribute("objectclass", new String("organizationalPerson")));
  attributeSet.add(new LDAPAttribute("userPrincipalName", "test"+"@test.com"));
  attributeSet.add(new LDAPAttribute("samAccountName", "tesst"));
  //attributeSet.add(new LDAPAttribute("datasource", "testSource"));   
  //attributeSet.add(new LDAPAttribute("userpassword", new String("newpassword")));   
  LDAPEntry entry = new LDAPEntry("cn=test,CN=Users,DC=test,DC=com",attributeSet);
  con.add(entry);
  con.disconnect();
  //红色部分要注意,这是不同于LDAP的地方,LDAP是UID为唯一标识,但是,AD为CN。连接完以后记得释放资源。
  
  
  三、.net修改密码(伪代码如下):
  PS:我只学了半小时.net,以前完全没接触过,写得不好,别拍砖
  
  modifyPass.aspx
  
  <html>
  
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <title>显示页面</title>
  </head>
  <body Style="padding:10px 0px 0px 0px">
  <%@ import namespace="System.DirectoryServices" %>
  <%@ import namespace="System.Web" %>
  <%
  String userName = Request.QueryString["userName"].ToString();
  String passWord = Request.QueryString["passWord"].ToString();
  string DomianPartA;
  string DomianPartB;
  string DomianName;
  string DomainServerIP;
  string DomianAdminName;
  string DomianAdminPass;
  DomianAdminName="administrator";
  DomianAdminPass="Abcd1234,";
  DomainServerIP="10.10.159.86";
  DomianPartA="test" ;
  DomianPartB="com";
  DomianName= DomianPartA + "@" + DomianPartB;
  //--添加用户
  System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry(DomainServer,DomianAdminName,DomianAdminPass, AuthenticationTypes.Secure);
  System.DirectoryServices.DirectoryEntry subEntry = entry.Children.Find("CN=Users");
  System.DirectoryServices.DirectoryEntry deUser = subEntry.Children.Find("cn="+userName);
  deUser.Invoke("ChangePassword",new object[]{"",passWord});
  deUser.Properties["userAccountControl"].Value = 0x200;
  deUser.CommitChanges();
  deUser.Close();
  Response.Write("修改密码成功");
  %> 
  </body>
  </html>
  
  
  四、java远程调用,修改密码(伪代码如下):
  
  String id = request.getParameter("id");
  
  String url = "http://"+ad_ip+"/modifyPass.aspx?userName="+ad+"&passWord=,Abcd1234";
  HttpClient client = new HttpClient();
  client.setConnectionTimeout(30 * 1000);
  HttpMethod method = new GetMethod(url);
  client.executeMethod(method);
  if (method.getStatusLine().toString().indexOf("200") > -1) {
  out.println("AD:"+method.getResponseBodyAsString()+"<br/>");
  out.flush();
  }
  method.releaseConnection();
  
  
  五、测试是否通过:
  
  login_ad.jsp
  
  
  <%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  <%@ page
  import="java.util.Hashtable,javax.naming.Context,javax.naming.InvalidNameException,javax.naming.NamingEnumeration,javax.naming.NamingException,javax.naming.AuthenticationException,javax.naming.directory.Attribute,javax.naming.directory.Attributes,javax.naming.directory.BasicAttribute,javax.naming.directory.BasicAttributes,javax.naming.directory.DirContext,javax.naming.directory.SearchControls,javax.naming.directory.SearchResult,javax.naming.ldap.Control,javax.naming.ldap.InitialLdapContext,javax.naming.ldap.LdapContext,javax.naming.ldap.LdapName,javax.naming.Name"%>
  <%@page import="com.novell.ldap.LDAPConnection"%>
  <%@page import="com.novell.ldap.LDAPSearchResults"%>
  <%@page import="com.novell.ldap.LDAPEntry"%>
  <%@page import="com.novell.ldap.LDAPAttribute"%>
  <%@page import="com.novell.ldap.LDAPAttributeSet"%>
  <%
  String userName = request.getParameter("userName1");
  String userPass = request.getParameter("userPass1");
  LDAPConnection con = new LDAPConnection();
  con.connect("10.10.159.86", 389);
  //System.out.print(userName.split("\\,")[0].split("=")[1]);
  con.bind(LDAPConnection.LDAP_V3, userName+"@winda.com", userPass);
  %>
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>测试LDAP同步AD</title>
  </head>
  <body>
  <%
  if(con != null){
  out.println("登陆成功!");
  }else{
  out.println("登陆失败!");
  }
  %>
  </body>
  </html>
  
  总结:
  这只是给大家一个解决思路,此程序存在安全问题,修改密码的时候,从地址栏传参数是不允许的。可以通过.net搭建webservice的方式来解决此问题,或者是调用加密的链接。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-220254-1-1.html 上篇帖子: windows 2008 Server could not authenticate the supplied identity解决方案 下篇帖子: Windows 2008实现iis7 +tomcat6的负载均衡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表