增加SharePoint2010修改域密码功能
转:http://blog.163.com/hr_test/blog/static/16485210720137953131694/
前提
SharePoint2010的用户基于AD的,因此修改密码是修改了AD的密码,当然也可以修改本机密码(非域的密码)。这里我们讨论修改域密码。我们修改需要用到sharepoint的弹出对话框的模式,以下为几个对话框函数:
? SP.UI.ModalDialog.showModalDialog:弹出对话框
? SP.UI.Status.addStstus:自定义状态栏信息
? SP.UI.Notify.addNotification:自定义消息通知
配置开发
1. 使用sharepoint designer2010打开对应站点http://moss:8002 ,找到v4.master如下图:

2. 打开编辑v4.master,如下图:


添加JS代码:
采用自定义通知栏模式<script language="javascript" type="text/javascript">function portal_openModalDialog(){var options = SP.UI.$create_DialogOptions();options.width = 500;options.height = 250;options.url = "/_layouts/TCL.EG.ModifyPasswd/ModifyPasswd.aspx";options.dialogReturnValueCallback = Function.createDelegate(null, portal_modalDialogClosedCallback);SP.UI.ModalDialog.showModalDialog(options);}//关闭函数function portal_modalDialogClosedCallback(result, value){if (value == "1"){//自定义通知栏SP.UI.Notify.addNotification("恭喜!修改成功!");}else if (value == "0"){//自定义通知栏SP.UI.Notify.addNotification("修改失败,请联系管理员!");}}//关闭函数function closeDialog(){SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.cancel, 3);}</script>?采用自定义状态栏模式
<script language="javascript" type="text/javascript">function portal_openModalDialog(){var options = SP.UI.$create_DialogOptions();options.width = 500;options.height = 250;options.url = "/_layouts/TCL.EG.ModifyPasswd/ModifyPasswd.aspx";options.dialogReturnValueCallback = Function.createDelegate(null, portal_modalDialogClosedCallback);SP.UI.ModalDialog.showModalDialog(options);}//关闭函数function portal_modalDialogClosedCallback(result, value){if (value == "1"){//自定义状态栏this.statusId = SP.UI.Status.addStatus ("恭喜!修改成功!",“修改密码成功,请重新登录!”,true);}else if (value == "0"){//自定义通知栏this.statusId =SP.UI.Status.addStatus ("修改失败!",“修改失败,请联系管理员!”,true);}SP.UI.Status.setStatusPriColor(this.statusId, "Green");setTimeout(RemoveStatus, 6000);}function RemoveStatus() {SP.UI.Status.removeStatus(this.statusId);}//关闭函数function closeDialog(){SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.cancel, 3);}</script>
加入母版页面中,签入即可,如下图:




3. 使用VS2010开发添加sharepoint空白项目,如下图:

4. 添加空元素,如下图:

<?xml version="1.0" encoding="utf-8"?><Elements xmlns="http://schemas.microsoft.com/sharepoint/"><CustomActionId="{BC477D9E-365A-47BD-AB2B-BE06FA44628D}"Title="修改密码"Description="此处修改的是域里面的密码"Sequence="1000"Location="Microsoft.SharePoint.StandardMenu"GroupId="PersonalActions"ImageUrl="~sitecollection/_layouts/images/menulistsettings.gif"><UrlAction Url="javascript:portal_openModalDialog();"/></CustomAction></Elements>
5. 添加修改密码的页面,页面代码部分如下:
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %><%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %><%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Register TagPrefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %><%@ Import Namespace="Microsoft.SharePoint" %><%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ModifyPasswd.aspx.cs" Inherits="TCL.EG.ModifyPasswd.Layouts.TCL.EG.ModifyPasswd.ModifyPasswd"DynamicMasterPageFile="~masterurl/default.master" %><asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server"></asp:Content><asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server"><table cellpadding="0" cellspacing="0" border="0"><tr><td>旧密码:</td><td><asp:TextBox ID="txtOldPwd" runat="server" TextMode="Password"></asp:TextBox></td></tr><tr><td>新密码:</td><td><asp:TextBox ID="txtNewPwd" runat="server" TextMode="Password"></asp:TextBox></td></tr><tr><td>确认密码:</td><td><asp:TextBox ID="txtConfirmPwd" runat="server" TextMode="Password"></asp:TextBox></td></tr><tr><td><asp:Button ID="btnUpdate" runat="server" Text="保存" OnClick="btnUpdate_Click" /></td><td><asp:Button ID="btnCancel" runat="server" Text="取消" OnClientClick="closeDialog()" /></td></tr><tr><td colspan="2"><font color="red"><asp:Label ID="Label_Title" runat="server" ></asp:Label></font></td></tr></table></asp:Content><asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">修改密码</asp:Content><asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea"runat="server">我的应用程序页</asp:Content>
6、后台代码.cs部分,如下:
using System;using Microsoft.SharePoint;using Microsoft.SharePoint.WebControls;using System.DirectoryServices.AccountManagement;using System.Security.Principal;using System.Runtime.InteropServices;using System.ComponentModel;using System.DirectoryServices;namespace TCL.EG.ModifyPasswd.Layouts.TCL.EG.ModifyPasswd{public partial class ModifyPasswd : LayoutsPageBase{#region//变量/// <summary>////// </summary>private string _userName;////// </summary>private PrincipalContext _principalContext;private string newPasswd = string.Empty;private string confirmPasswd = string.Empty;private string oldPasswd = string.Empty;#endregion#region//事件protected void Page_Load(object sender, EventArgs e){if (!Page.IsPostBack){}}/// <summary>/// 更新密码/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void btnUpdate_Click(object sender, EventArgs e){if (SPContext.Current != null){//登录名_userName = SPContext.Current.Web.CurrentUser.LoginName;//if (_userName.ToLower() == "sharepoint\\system"){_userName = "contoso\\mossadmin";}//旧密码不允许为空//修改密码newPasswd = this.txtNewPwd.Text.Trim();confirmPasswd = this.txtConfirmPwd.Text.Trim();oldPasswd = txtOldPwd.Text.Trim();//if (string.IsNullOrEmpty(oldPasswd)){this.Label_Title.Text = "请输入旧密码!";return;}if (string.IsNullOrEmpty(newPasswd)){this.Label_Title.Text = "请输入新密码!";return;}if (string.IsNullOrEmpty(confirmPasswd)){this.Label_Title.Text = "请输入确认密码!";return;}//判断2次密码是否一致。if (newPasswd != confirmPasswd){this.Label_Title.Text = "新密码与确认密码不一致!";return;}//_userNameif (!string.IsNullOrEmpty(_userName)){//登录名为contoso\\mossadmintry{//检查原始密码是否正确bool isOK = CheckUser(ValidType.Domain, _userName, oldPasswd);//如果正确if (!isOK){this.Label_Title.Text = "旧密码输入错误!";return;}else{//更改密码bool isreult = UpdateMyPassword(newPasswd, oldPasswd);//if (isreult){//提示信息Response.Write("<script type=\"text/javascript\">window.frameElement.commonModalDialogClose(1, 1);</script>");}}}catch (Exception ex){this.Label_Title.Text = ex.Message;}}}}#endregion#region//方法#region//修改密码/// <summary>/// 修改密码/// </summary>/// <param name="newUserPasswd">新密码</param>/// <param name="oldUserPasswd">原始密码</param>/// <returns>返回结果是否成功</returns>private bool UpdateMyPassword(string newUserPasswd,string oldUserPasswd){//返回okbool _result = false;try{Impersonator Imp = new Impersonator();//开始Imp.BeginImpersonation();//using (var context = new PrincipalContext(ContextType.Domain)){using (UserPrincipal usr = UserPrincipal.FindByIdentity(context,IdentityType.SamAccountName,Microsoft.SharePoint.SPContext.Current.Web.CurrentUser.LoginName)){usr.UserCannotChangePassword = true;usr.ChangePassword(oldUserPasswd, newUserPasswd);}}//修改if (Imp.IsImpersonated){Imp.StopImpersonation();//Ok_result = true;}else{//fail_result = false;}}catch(Exception ex){this.Label_Title.Text = ex.Message;_result = false;}//returnreturn _result;}#endregion#region//验证原始密码是否正确/// <summary>/// 验证原始密码是否正确/// </summary>/// <param name="validType">验证类型</param>/// <param name="UserName">登录名</param>/// <param name="PassWord">登录密码</param>/// <returns>返回是否成功的标识</returns>public Boolean CheckUser(ValidType validType, String UserName, String PassWord){try{String[] UserArray = UserName.Split(new char[] { '\\' }); //UserName 組合為 Domain\Account 或 MachineName\AccountInitPC(validType, UserArray[0]);Boolean isValid = _principalContext.ValidateCredentials(UserArray[1], PassWord);return isValid;}catch (Exception ex){this.Label_Title.Text = ex.Message;return false;}}#endregion#region//PrincipalContext初始化/// <summary>/// PrincipalContext初始化/// </summary>/// <param name="validType">验证类型</param>/// <param name="LDAPName">应用程序</param>private void InitPC(ValidType validType, String LDAPName){//PrincipalContext pc = null;int typeNum = (int)validType;switch (typeNum){case 1:_principalContext = new PrincipalContext(ContextType.Domain, LDAPName);break;case 2:_principalContext = new PrincipalContext(ContextType.Machine, LDAPName);break;case 3:_principalContext = new PrincipalContext(ContextType.ApplicationDirectory, LDAPName);break;default:break;}}#endregion#region//枚举类型/// <summary>/// 枚举类型/// </summary>public enum ValidType{/// <summary>/// 域/// </summary>Domain = 1,/// <summary>/// 机器/// </summary>Machine = 2,/// <summary>/// 应用程序/// </summary>ApplicationDirectory = 3}#endregion#endregion}}
7. Impersonator.cs代码部分如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Security.Principal;namespace TCL.EG.ModifyPasswd{public class Impersonator{private WindowsImpersonationContext ctx = null;public bool IsImpersonated { get; set; }public void BeginImpersonation(){try{if (!WindowsIdentity.GetCurrent().IsSystem){ctx = WindowsIdentity.Impersonate(WindowsIdentity.GetCurrent().Token);IsImpersonated = true;}}catch{IsImpersonated = false;}}public void StopImpersonation(){if (ctx != null){ctx.Undo();}}}}
8. 部署后,看下效果图:


自定义通知栏效果图:

自定义状态栏效果图:

注意事项:
1、 密码复杂度策略,最好合符要求,否则会提示:密码不合符复杂度策略。要不,干脆不禁用此策略,在代码中用自己定义策略,用正则表达式,如下图:

2、 为了能每天多次修改密码,此时应当禁用如下策略,如下图:

否则定义好,必须按照此策略进行。策略更新后请重启系统或用gpupdate进行策略刷新即可。
增加SharePoint2010修改域密码功能的更多相关文章
- 为VisualSVN Server增加在线修改用户密码的功能
原文:为VisualSVN Server增加在线修改用户密码的功能 附件下载:点击下载 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便. 不过 ...
- Microsoft Dynamics CRM 如何修改域密码
一.安装IIS6脚本工具,如下图所示: 二.复制iisadmpwd文件夹到AD Server的C:\Windows\SysWOW64\inetsrv文件夹下 三.注册Iisadmpwd目录下的IISp ...
- 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能
上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...
- Sharepoint增加修改密码功能
Sharepoint中没有自带的修改密码的功能. 如果使用的是AD验证,修改密码,只要修改域帐号的用户名密码就可以了.以下代码可以修改本机密码和域帐号密码. 做法是,添加一个webpart,做一个页面 ...
- SharePoint2013 以其他用户登录和修改AD域用户密码 功能
sharepoint默认是没有修改AD密码 和切换 用户的功能,这里我用future的方式来实现. 部署wsp前: 部署后: 点击以其他用户身份登录 点击修改用户密码: 这里的扩展才菜单我们用Cust ...
- Window通过Web方式修改域用户密码
如何通过web方式修改域用户密码: 1.在Windows Server 2003上,系统默认提供了iisadmpwd作为一种修改域用户密码的方式 2.在Windows Server 2008上,可以提 ...
- python3之对本地TXT文件进行增加,删除,修改,查看功能。
由于是初学,代码如有不足,欢迎指出! 本博客记录我的编程之路,记录所学到的知识,分享所学心得! 这是我的一个作业. 首先分析要求: 创建一个TXT文件用于存储账号与密码 实现对文件进行增加,删除,修改 ...
- windows server 2008 修改域的密码策略
1.一般情况下,进入本地安全策略修改密码策略时,,密码策略已经被锁定,无法更改,若要修改域服务器上的密码策略,请按照步骤2--6进行修改 2.在此情况下要改密码策略的过程如下, 进入组策略管理: 3. ...
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...
随机推荐
- web配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- mysqlbinlog工具基于日志恢复详细解释
如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作 1)RESET MASTER在上面查看日志存放的文件夹中 ...
- 从后端到页面:如何全方位监控 Ruby 应用?
[编者按]本文参考技术分享 ,由 OneAPM 工程师补充整理,并且已经征得原作者的同意. 为什么选择 OneAPM ? 在性能监控领域,业界比较有名的是 New Relic 还有 Appdynami ...
- java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”
/* * 2 一个子串在整串中出现的次数. * "loveerlovetyloveuiloveoplove" * 思路: * 1,要找的子串是否存在,如果存在获取其出现的位置.这个 ...
- java基础知识回顾之---java String final类之intern方法
public class StringObjectDemo { /** * @param args */ public static void main(String[] args) { String ...
- hdu 2481 Toy
好题!!!没话说…… 用到的知识面很多,这题的难点在于公式的推导. 原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795d ...
- 初识spring与quartz整合实现定时任务
参考资料: http://kevin19900306.iteye.com/blog/1397744 引用自别人的博客: 特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2 ...
- linux软中断与硬中断实现原理概述
linux软中断与硬中断实现原理概述. 1.软中断通过open_softirq注册一个软中断处理函数,即在软中断向量表softirq_vec数组中添加新的软中断处理action函数. 2.调用rais ...
- LAMP环境 源码包安装
linux的学习很早就开始了,大学的时候的时候有有学过unix,后来每年都有去看看linux,因为在小城市的缘故,很少会实际工作中用到,基本都是智慧云之类的,同事也说,你学起来也用不上,IT生态不好, ...
- Sina App Engine(SAE)入门教程(3)-KVDB使用
简介 因为传统关系型数据库在分布式环境下表现的扩展性不足等缺点,近年来NoSQL的概念渐渐成为业界关注的焦点,越来越多的技术人员也习惯于使用NoSQL数据库进行日常开发,SAE为了应对这种新需求,也进 ...