SharePoint重置密码功能Demo

博客地址 http://blog.csdn.net/foxdave

本文将说明一个简单的重置SharePoint用户密码(NTLM Windows认证)的功能如何实现

重置密码功能,实际上就是重置域用户密码的功能,其实很简单。

解决方案结构如下图所示:

1. 创建SharePoint空解决方案。

2. 添加一个空元素,命名为ResetPassword,并将随之生成的Feature也一并修改,范围选择Site。

3. 我们想将重置密码的功能添加到用户菜单下,所以在空元素的Emlements.xml中,填写如下定义:

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction
    Id="{97526618-3FA0-4117-9882-9A1127C56687}"
    Title="重置用户密码"
    Description="重置用户密码"
    Sequence="1003"
    Location="Microsoft.SharePoint.StandardMenu"
    GroupId="PersonalActions"
    ImageUrl=""
    Rights="EditListItems">
    <UrlAction Url="_layouts/ResetPassword/ResetPassword.aspx"/>
  </CustomAction>
</Elements>

定义的具体说明参阅“CustomAction Element”。

4. 添加Layous映射文件夹,其下的文件夹命名为ChangePassword,添加应用程序页。

对应用程序页进行编辑,添加必要的控件如要重置的用户名文本框、重置确认按钮、消息提示控件等。

前台页面:

<asp:Literal ID="ltMsg" EnableViewState="false" runat="server"></asp:Literal>
    <div>
        <h3>
            <span>重置密码</span>
        </h3>
        <table width="400px">
            <tr>
                <td>用户名
                </td>
                <td>:
                </td>
                <td>
                    <asp:TextBox ID="txtUser" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td colspan="3" align="center">
                    <br />
                    <asp:Button ID="btnResetPwd" runat="server" Text="重置密码" OnClick="btnResetPwd_Click" />
                </td>
            </tr>
        </table>
        <br />
        <br />
    </div>

后台核心代码:

protected void btnResetPwd_Click(object sender, EventArgs e)
        {
            if (this.txtUser.Text.Trim().Equals("admin"))
            {
                this.ltMsg.Text = "管理员密码不能重置";
                return;
            }
            ResetPwd(this.txtUser.Text, "123456");
        }

        private void ResetPwd(string userName, string password)
        {
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    var directoryEntry = GetDirectoryEntryByUserName(userName);
                    if (directoryEntry == null)
                    {
                        this.ltMsg.Text = "未找到该用户";
                        return;
                    }
                    directoryEntry.Invoke("SetPassword", new object[] { password });
                    directoryEntry.Properties["LockOutTime"].Value = 0;
                    directoryEntry.Close();
                    directoryEntry.Dispose();
                    this.ltMsg.Text = userName + "的密码已经重置为123456";
                });
            }
            catch (Exception e)
            {
                this.ltMsg.Text = "发生错误,请联系管理员:\r\n" + e.ToString();
            }
        }

        private DirectoryEntry GetDirectoryEntryByUserName(string userName)
        {
            var de = GetDirectoryObject(GetDomain());
            var deSearch = new DirectorySearcher(de) { SearchRoot = de, Filter = "(&(objectCategory=user)(samAccountName=" + userName + "))" };
            var results = deSearch.FindOne();
            return results != null ? results.GetDirectoryEntry() : null;
        }

        private string GetDomain()
        {
            //string adDomain = WebConfigurationManager.AppSettings["adDomainFull"];
            string adDomain = "contoso.com";
            var domain = new StringBuilder();
            string[] dcs = adDomain.Split(‘.‘);
            for (var i = 0; i < dcs.GetUpperBound(0) + 1; i++)
            {
                domain.Append("DC=" + dcs[i]);
                if (i < dcs.GetUpperBound(0))
                {
                    domain.Append(",");
                }
            }
            return domain.ToString();
        }

        private DirectoryEntry GetDirectoryObject(string domainReference)
        {
            string adminUser = "admin";//WebConfigurationManager.AppSettings["adAdminUser"];
            string adminPassword = "contosopwd";//WebConfigurationManager.AppSettings["adAdminPassword"];
            string fullPath = "LDAP://" + domainReference;
            var directoryEntry = new DirectoryEntry(fullPath, adminUser, adminPassword, AuthenticationTypes.Secure);
            return directoryEntry;
        }

至此,重置密码的功能就完成了,我的代码里使用了SPSecurity.RunWithElevatedPrivileges(delegate()...

提权用,是的,如果不提权的话无法重置密码,会报0x80070005 (E_ACCESSDENIED)这个错误。

时间: 2024-11-09 02:47:38

SharePoint重置密码功能Demo的相关文章

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;用户管理模块新增“重置用户密码”功能

不管是什么系统登录用户都有忘记密码的时候,忘记密码就进入不了系统.系统应该可以提供重置用户密码的功能.在我们框架中重置用户密码功能一般用用户管理员来完成.当然如果做得复杂点还可以由用户自己来重置(如:通过邮件.手机短信等方式).RDIFramework.NET V3.2版本新增了用户重置密码的服务接口以供调用,同时在框架Web与WinForm版本的"用户管理"模块分别新增了"重置密码"的功能.用户忘记密码后只需要通知管理员,让管理员通用用户管理模块重置用户的密码为系

Exchange 2013 ecp中启用重置用户密码功能

Ex2013 默认情况下,此功能是没有显示的嵌入到ECP当中的,如图示: 但是我们可以通过对权限组赋予"Reset Password"权限来实现. 如: New-ManagementRoleAssignment -Role "Reset Password" -SecurityGroup "IT User Create " 加如遇到一下错误: 我们需要在EMS中执行如下指令: [PS] C:\Windows\system32> Add-pss

MVC5 网站开发之六 管理员功能之添加、删除、重置密码、修改密码、列表浏览

  一.安装插件. 展示层前端框架以Bootstrap为主,因为Bootstrap的js功能较弱,这里添加一些插件作补充.其实很多js插件可以通过NuGet安装,只是NuGet安装时添加的内容较多,不如自己复制来的干净,所以这里所有的插件都是下载然后复制到项目中. 1.Bootstrap 3 Datepicker 4.17.37 网址:https://eonasdan.github.io/bootstrap-datetimepicker/ 下载并解压压缩包->将bootstrap-datetim

Django内置重置密码的功能(发邮箱)

首先我们要想用Django内置的重置密码的功能,我们要知道Django内置的函数是怎么写的 def password_reset(request, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', subject_template_name='registration/password_reset_subject.

PHP会员找回密码功能实现实例介绍

设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3.系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678). 4.系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名.临时密码.提醒用户及时修改临时密码的提示语). 5.用户用临时密码即可登录. HTML 我们在找回密码的页面上放置

Android &#39;记住密码&#39;功能

1.运行后界面图 2.主要代码: 2.1 activity_main.xml(2个TextView 2个EditText 1个CheckBox以及1个Button): 1 <TextView 2 android:id="@+id/tvAccount" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 android:layout_al

SpringMVC通过邮件找回密码功能的实现

1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 3.加密能防止伪造攻击,一次url只能验证一次,

找回密码功能的实现(考虑安全性,加密方面)

最近负责公司的登陆与注册模块,大部分已经实现了,这找回密码功能实现的思路是这样的 1.用户忘记密码,需要找回密码 2.后台通过一系列的加密处理,将通过后台邮件将重置密码的页面发送到该用户的邮箱 3.用户通过邮箱里烦人链接就可以重置密码. 以下是代码 /* ------------------------------------------忘记密码,发送邮件------------------------------------------------- */ //找回密码发送邮件功能 @Requ

如何在不同场景下采用正确的重置密码和解锁方式?

就像大家知道的,ADSelfService Plus 允许员工重置忘记的密码,并且解锁自己的账户.这些功能深受大家欢迎,非常多的企业已经采取了这种模式,让员工自己去重置自己的密码.解锁他们的账户.我们要做的就是确保所有使用ADSelfService Plus的用户可以完全掌握该软件的各个功能,并能够熟练的进行操作.下面我们来讲解重置密码以及解锁账户的三种方式: 使用iPhone或者安卓手机应用程序来实现, 如图1所示.移动应用程序可以从App Store或Play Store下载.图1. ADS