sharepoint修改密码
增加SharePoint2010修改域密码功能
前提
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进行策略刷新即可。
sharepoint修改密码的更多相关文章
- sharepoint 修改AD密码
sharepoint 修改AD密码 下面是添加添加“空元素”代码: 第一个<CustomAction>是添加修改密码项目 第二个<CustomAction>是添加js修改脚本 ...
- Sharepoint增加修改密码功能
Sharepoint中没有自带的修改密码的功能. 如果使用的是AD验证,修改密码,只要修改域帐号的用户名密码就可以了.以下代码可以修改本机密码和域帐号密码. 做法是,添加一个webpart,做一个页面 ...
- 分享修改密码的SharePoint Web part: ITaCS Change Password web part
Codeplex 上有一个现成的修改密码的Web part, 在SharePoint 2010和SharePoint 2013都可以用 项目地址:http://changepassword.codep ...
- SharePoint重置密码功能Demo
博客地址 http://blog.csdn.net/foxdave 本文将说明一个简单的重置SharePoint用户密码(NTLM Windows认证)的功能如何实现 重置密码功能,实际上就是重置域用 ...
- SharePoint 2010:“&”作为SharePoint账号密码引起的错误
一朋友修改了SharePoint 2010系统账号密码,导致无法登陆.他的环境如下: 两台服务器:AD+SharePoint 2010 ,Sql Server 2008 r2 目标站点开启了Form登 ...
- MVC5 网站开发之六 管理员 2、添加、删除、重置密码、修改密码、列表浏览
目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网 ...
- win7下安装mysql后修改密码
mysql的安装教程网上很多,此处不过多介绍,个人觉得下面这篇教程是比较好的,一步到位.MySQL 5.7.9 ZIP 免安装版本配置过程_百度经验 http://jingyan.baidu.com ...
- linux创建新用户以及修改密码
1. 使用root账户创建新用户 useradd webuser 2. 修改新增的用户的密码 passwd webuser 这时候会提示你输入新的密码: 注意:不要用su webuser进入该账户修改 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
随机推荐
- 图书封面制作-ps图片处理使用教程
这是一个实用而有趣的教程,在这个PS教程中,我们来学习如何使用photoshop制作一个立体的软件产品盒子. 1.首先运行photoshop创建一个500*500像素的新文件,背景颜色为白色,如图所示 ...
- C# AttributeUsage的使用浅析
C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们控制定制特性的使用 ...
- Java-transient
transient的作用及使用方法 都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这 ...
- Java基础-设计模式之-代理模式Proxy
代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...
- 21.Android之SQLite数据库学习
Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...
- Vijos1889 天真的因数分解
描述 小岛: 什么叫做因数分解呢?doc : 就是将给定的正整数n, 分解为若干个素数连乘的形式.小岛: 那比如说 n=12 呢?doc : 那么就是 12 = 2 X 2 X 3 呀.小岛: 呜呜, ...
- linux3
第一课:date +%Y-%m-%d 显示日期date +%H:%M 显示小时分钟date 显示日期 vi /etc/sysconfig/network-scripts/ifcfg-eth0 网卡配置 ...
- gcc/g++ 参数
-static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么 动态连接库,就可以运行. -share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
- delete this及堆破坏检测方法
作者: Bruce 日期: 2012年06月03日 04:20 周日 发表评论 (0) 查看评论 --END*1--> 0 条评论 --END*2-->1,837 人阅读 程序BU ...
- 支付宝微信O2O大战,WiFi广告在夹缝中求生存
支付宝微信O2O大战,WiFi广告在夹缝中求生存 来自工信部的数据显示,截至2013年底,中国智能手机的保有量已经达到5.8亿台.国内平均有46%的时间选择WiFi上网. 商用WiFi已经成为了移动互 ...