由于业务需要,近期做了个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的方式来解决此问题,或者是调用加密的链接。
分享到:
相关推荐
Sun One LDAP v5.2是Sun Microsystems公司推出的一款基于Windows操作系统的轻量级目录访问协议服务器。这款软件在LDAP领域提供了高效、灵活且易于管理的解决方案,尤其适用于组织内部的身份管理和目录服务。在这个...
Microsoft Windows Server 2008操作系统中的活动目录(Active Directory,简称AD)作为微软的一种目录服务技术,为用户提供了一套全面的解决方案,用于管理和组织网络资源。本书《掌握Active Directory for Windows ...
Sun Java System Directory Server Enterprise Edition 6.2,作为Sun Microsystems公司推出的一款高级目录服务器软件,提供了强大的LDAP(轻量级目录访问协议)服务。该版本的部署规划指南详细介绍了如何在企业环境...
### LDAP学习资料与Sun Java System Directory Server 5.2管理手册解析 #### 一、LDAP基础知识 LDAP(Lightweight Directory Access Protocol),即轻量级目录访问协议,是一种应用层协议,用于访问和维护分布式...
6. 兼容性:Sun One Directory Server 5.2 可以与其他Sun产品以及第三方应用无缝集成,如身份管理解决方案、邮件系统和网络设备,实现整个IT环境的身份和访问管理。 7. 更新与补丁:ds.5.2.P4.Windows.full 指的是...
本文详细介绍了从旧服务器到新服务器的LDAP账号数据迁移过程,包括了OpenLDAP服务器的安装配置、数据迁移的具体步骤以及数据完整性的验证方法。通过这些步骤,可以有效地完成LDAP服务的迁移工作,确保业务的连续性和...
Windows Server 2008 Active Directory 轻型目录服务(AD LDS)是一种功能齐全且易于安装部署的目录服务。它提供了一个用于应用程序的专门数据存储,并可进行单独配置和管理。作为非操作系统服务运行,允许多个 AD ...
adLDAP - LDAP Authentication with PHP for Active Directory adLDAP is a PHP class that provides LDAP authentication and integration with Active Directory. Intelligent Active Directory integration ...
标题中的“AD(Active Directory)查看工具”指的是用于管理和查看Microsoft Windows网络环境中的Active Directory服务的应用程序。Active Directory是微软提出的一种目录服务,它在Windows Server操作系统中扮演着...
Sun Java System Directory Server 5.2 是一款由Sun Microsystems开发的企业级 Lightweight Directory Access Protocol (LDAP) 服务器。作为目录服务的核心组件,它被设计用于存储、管理和检索大量结构化数据,如...
LDAP 广泛应用于企业目录服务中,如 Active Directory、OpenLDAP 等。 Java 使用 LDAP 修改 AD 域用户密码 在 Java 中,我们可以使用 LDAP 客户端库来连接到 Active Directory 域控制器,并对用户密码进行修改。...
Windows 2003 Server的Active Directory支持与其他目录服务的集成,如LDAP(轻量级目录访问协议)和 Kerberos 身份验证协议。此外,还可以通过ADSI(Active Directory Service Interfaces)和LDIFDE(LDAP数据交换...
Active Directory(AD)是一种目录服务,由微软公司开发,用于在 Windows 操作系统中管理和存储用户、组、计算机和其他对象的信息。它提供了一个集中化的身份验证和授权机制,使得管理员可以更方便地管理网络中的...
《Windows Server 2012 R2 Active Directory配置指南》是由戴有炜编著的一本专业书籍,旨在帮助读者深入理解和掌握在Windows Server 2012 R2操作系统中配置和管理Active Directory(AD)域服务的技术。这本书包含了...
总结来说,Windows Server 2003 中的Active Directory 提供了一种强大而灵活的目录服务解决方案,它不仅增强了网络的安全性和管理效率,还通过与其他服务器角色的集成,促进了企业生产力的提升。这些特性使其成为...
其中,Active Directory (AD) 和 Lightweight Directory Access Protocol (LDAP) 是两种广泛使用的工具和技术,用于管理和验证网络中的用户和服务。 **LDAP**是一种基于X.500标准的应用层协议,用于访问和维护...
在IT领域,Windows域管理是企业网络环境中的核心组成部分,它通过Active Directory(AD)服务实现对用户、计算机、资源的集中管理和控制。本文将深入探讨Windows域管理网页版的实现,以及相关的编程技术和应用。 ...
Covers the new Active Directory Federation Services (AD FS) that are included with Windows Server 2003 R2. Chapter 20, Microsoft Exchange Server 2007 and Exchange Server 2003 Covers common ...
django-auth-ldap-ad, Django 认证后端,支持 Active Directory django-auth-ldap-ad为什么Django 认证后端,支持 Active Directory由于无法找到使用 django-auth-ldap 绑定到SASL的正确方式,所以我创建了这个项目...