转: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/">
  <CustomAction
      Id="{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;
                }
                //_userName
                if (!string.IsNullOrEmpty(_userName))
                {
                    //登录名为contoso\\mossadmin
                    try
                    {
                        //检查原始密码是否正确
                        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)
        {
            //返回ok
            bool _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;
            }
            //return
            return _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\Account

                InitPC(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修改域密码功能的更多相关文章

  1. 为VisualSVN Server增加在线修改用户密码的功能

    原文:为VisualSVN Server增加在线修改用户密码的功能 附件下载:点击下载 VisualSVN Server是一个非常不错的SVN Server程序,方便,直观,用户管理也异常方便. 不过 ...

  2. Microsoft Dynamics CRM 如何修改域密码

    一.安装IIS6脚本工具,如下图所示: 二.复制iisadmpwd文件夹到AD Server的C:\Windows\SysWOW64\inetsrv文件夹下 三.注册Iisadmpwd目录下的IISp ...

  3. 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能

    上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...

  4. Sharepoint增加修改密码功能

    Sharepoint中没有自带的修改密码的功能. 如果使用的是AD验证,修改密码,只要修改域帐号的用户名密码就可以了.以下代码可以修改本机密码和域帐号密码. 做法是,添加一个webpart,做一个页面 ...

  5. SharePoint2013 以其他用户登录和修改AD域用户密码 功能

    sharepoint默认是没有修改AD密码 和切换 用户的功能,这里我用future的方式来实现. 部署wsp前: 部署后: 点击以其他用户身份登录 点击修改用户密码: 这里的扩展才菜单我们用Cust ...

  6. Window通过Web方式修改域用户密码

    如何通过web方式修改域用户密码: 1.在Windows Server 2003上,系统默认提供了iisadmpwd作为一种修改域用户密码的方式 2.在Windows Server 2008上,可以提 ...

  7. python3之对本地TXT文件进行增加,删除,修改,查看功能。

    由于是初学,代码如有不足,欢迎指出! 本博客记录我的编程之路,记录所学到的知识,分享所学心得! 这是我的一个作业. 首先分析要求: 创建一个TXT文件用于存储账号与密码 实现对文件进行增加,删除,修改 ...

  8. windows server 2008 修改域的密码策略

    1.一般情况下,进入本地安全策略修改密码策略时,,密码策略已经被锁定,无法更改,若要修改域服务器上的密码策略,请按照步骤2--6进行修改 2.在此情况下要改密码策略的过程如下, 进入组策略管理: 3. ...

  9. javaWeb实现使用邮箱邮件找回密码功能

    JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...

随机推荐

  1. java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”

    /*需求:在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符.但对应的字节数不同,一个汉字占两个字节.定义一个方法,按照最大的字节数来取子串.如:对于“ab你好”,如果取三 ...

  2. http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html

    http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html http://www.cnblogs.com/madyina/p/370 ...

  3. 如何在linux系统下对文件夹名有空格的文件夹进行操作

    http://www.2cto.com/os/201409/335119.html 在Windows操作系统中可以轻易地创建\移动\删除文件夹名带有空格的文件夹, 而在linux则需要进行一些特殊的处 ...

  4. OPenGL中三维图形的矩阵变换

    对于二维的图形开发,拿简单的图片显示来说,我们主要的目的:就是在一块显示buffer中,不停的把每个像素进行着色,然后就可以绘制出来了.为了速度,很多其他的加速方法,但原理基本上就是这样了. 很直观, ...

  5. tomcat源码导入eclipse

    1. 获取源代码 方式一:从官网http://tomcat.apache.org/download-70.cgi 直接下载,官网提供了Binary 和 Source Code两种下载方式,要研究tom ...

  6. linux进程的地址空间,核心栈,用户栈,内核线程

    linux进程的地址空间,核心栈,用户栈,内核线程 地址空间: 32位linux系统上,进程的地址空间为4G,包括1G的内核地址空间,和3G的用户地址空间. 内核栈: 进程控制块task_struct ...

  7. java中什么时候该用static修饰方法?有什么好处或者坏处?

    当一个方法或者变量需要初始化加载,或者是经常被调用的时候可以加上static.用static修饰的方法可以用类名直接调用,不用的一定要先实例化一个对象然后才可以调用比如 person这个类里面有一个方 ...

  8. Quartz任务调度快速入门

    Quartz任务调度快速入门 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的 ...

  9. servlet会话技术:Cookie

    什么是会话会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.会话过程中需要解决的一些问题每个用户在使用浏览器与服务器进 ...

  10. Spring IoC — 基于注解的配置

    基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现. @Component:对类进行标注,Spring容器 ...