話說 Sharepoint portal Server 2003 的用戶管理是整合Active Directory來的 ,
假使用戶到達一定數量 , 管理人員每天光花在維護使用者資料的時間就很可觀了
所以這時 , 如果能把工作自動化 , 排程化 , 或是交由使用者自行維護 , 省下的時間
就可以多MSN 或跟幾個MM QQ了 ...(笑)
這時我們 程式設計師(程式員) 的作用就來了 , 寫隻程式來解決MIS(網管)的工作
讓他們有時間多Q幾個MM(別忘了叫他介紹) , 也表現自己的專長 , 利人利己嘛...
廢話到此 , 對於AD的操作 , 大多是根據DirectoryService這個namespace來操作
今天就來為大家介紹個簡單的功能 -- [變更密碼] , 這是很基本的需求 , 但也是經常發生
也是關係企業內資訊安全的重要課題 . 相信應該對大家很有幫助 .
以下是我實作的方式:
因為是應用於SPS上頭 , 所以我用Webpart來實作 , console , WindowForm , webform 的方式大同小異
大家參考一下都應該可以實現.
我是用Sharepoint portal server 2003 + Visual Studio 2003 來開發 .
如下圖:
變更密碼前提當然是指定"使用者" , 所以我用一個Label控制項來顯示使用者登入帳號
並加了三個TextBox控制項 , 分別讓使用者能輸入舊密碼與新密碼及確認新密碼 .
ps.對於管理者來說 , 當然可以修改任何人的密碼 , 不過本功能以使用者導向 , 並非管理導向
有興趣的朋友可自己修改
然後再加入兩個按鈕 , 一個為確定修改密碼 , 一個取消修改密碼 (清空欄位)
畫面準備完畢 , 開始動工....
建立一個Webpart專案:
可更改成符合你所需要的命名空間.
接下來宣告所需要的控制項
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.WebPartPages;
using System.DirectoryServices;
namespace ChangePassword
{
/// <summary>
/// Description for WebPart1.
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:WebPart1 runat=server></{0}:WebPart1>"),
XmlRoot(Namespace="ChangePassword")]
public class WebPart1 : Microsoft.SharePoint.WebPartPages.WebPart
{
private TextBox txtOldPassword;
private TextBox txtNewPassword;
private TextBox txtCrmPassword;
private Button btnSubmit;
private Button btnCancel;
private Label lblmsg;
private string sMsg="";
private HtmlTable t;
三個TextBox , 兩個按鈕 , 一個Label , 一個HtmlTable , 一個 string 是我用來紀錄訊息的 .
屬性部份 , 本範例沒有用到 , 各位可依實際情況使用
所以我將預設的Text屬性 設為 Browsable(false)
接下來 , 把控制項都Render到頁面上去 , 需要override CreateChildControls() 這個Method
protected override void CreateChildControls()
{
t =new HtmlTable();
t.Border = 0;
t.Align ="center";
t.CellPadding =0;
t.CellSpacing = 0;
HtmlTableRow tr;
HtmlTableCell tc;
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText="登入帳號:";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
tc.InnerText= Context.User.Identity.Name;
tr.Cells.Add(tc);
t.Rows.Add(tr);
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText="請輸入舊密碼:";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
txtOldPassword =new TextBox();
txtOldPassword.TextMode =TextBoxMode.Password;
tc.Controls.Add(txtOldPassword);
tr.Cells.Add(tc);
t.Rows.Add(tr);
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText="請輸入新密碼:";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
txtNewPassword =new TextBox();
txtNewPassword.TextMode =TextBoxMode.Password;
tc.Controls.Add(txtNewPassword);
tr.Cells.Add(tc);
t.Rows.Add(tr);
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText="請確認新密碼:";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
txtCrmPassword =new TextBox();
txtCrmPassword.TextMode=TextBoxMode.Password;
tc.Controls.Add(txtCrmPassword);
tr.Cells.Add(tc);
t.Rows.Add(tr);
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText=" ";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
btnSubmit =new Button();
btnSubmit.Text="確定";
btnSubmit.ID="btnSubmit";
btnSubmit.Click += new System.EventHandler(this.btnSubmit_Click);
btnCancel =new Button();
btnCancel.Text="取消";
btnCancel.ID="btnCancel";
btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
tc.Controls.Add(btnSubmit);
tc.Controls.Add(btnCancel);
tr.Cells.Add(tc);
t.Rows.Add(tr);
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText=" ";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
tc.InnerText=" ";
tr.Cells.Add(tc);
t.Rows.Add(tr);
tr=new HtmlTableRow();
tc=new HtmlTableCell();
tc.InnerText=" ";
tr.Cells.Add(tc);
tc=new HtmlTableCell();
tr.Cells.Add(tc);
t.Rows.Add(tr);
Controls.Add(t);
lblmsg = new Label();
lblmsg.ID="lblmsg";
Controls.Add(lblmsg);
}
內容很單純是組出我所想要的UI...
重點是記得將兩個按鈕所觸發的event delegate 上
btnSubmit.Click += new System.EventHandler(this.btnSubmit_Click);
btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
再來就是寫方法了 .
首先先從最簡單的取消按鈕開始
btnCancel_Click
private void btnCancel_Click(object sender, System.EventArgs e)
{
txtNewPassword.Text ="";
txtOldPassword.Text ="";
txtCrmPassword.Text="";
lblmsg.Text = "";
sMsg = "";
}
把所有的TextBox的值都清空...(這應該不需要註解吧.建議改成Client-Side Script )
btnSubmit_Click
private void btnSubmit_Click(object sender, System.EventArgs e)
{
try
{
lblmsg.Text="";
if(txtNewPassword.Text == string.Empty || txtOldPassword.Text == string.Empty || txtCrmPassword.Text== string.Empty)
{
sMsg +="<script>alert('Password can not be Empty');</script>";
return;
}
//檢查密碼欄位不得為空值
if(txtNewPassword.Text.Length < 5 || txtOldPassword.Text.Length < 5 || txtCrmPassword.Text.Length < 5 )
{
sMsg +="<script>alert('Password Length must be 5 at least!');</script>";
return;
}
//檢討密碼複雜度....請依實際狀況修改
if(txtNewPassword.Text !=txtCrmPassword.Text)
{
sMsg +="<script>alert('Please Confirm Your Password again!');</script>";
return;
}
//檢查新密碼是否相符
string strUser=Context.User.Identity.Name;
if(strUser.IndexOf("\\") > 0)
{
strUser=strUser.Substring(strUser.IndexOf("\\")+1);
}
//組帳號字串
ChangePassword(strUser,txtOldPassword.Text,txtNewPassword.Text);
//執行變更密碼 , 代入 帳號 , 舊密碼 , 新密碼
}
catch(Exception ex)
{
lblmsg.Text="<br>" + ex.InnerException.ToString();
lblmsg.ForeColor = System.Drawing.Color.Red;
}
}
private void ChangePassword(string strUser,string sOld,string sNew)
{
try
{
DirectoryEntry lObjEntry = this.FindEntry(strUser);
//依帳號找出 DirectoryEntry實體
lObjEntry.Invoke("ChangePassword", new object[] {sOld,sNew});
//執行變更密碼函式
lObjEntry.CommitChanges();
lObjEntry.Close();
lblmsg.Text="變更密碼成功!<br>下次請用新密碼登入!";
lblmsg.ForeColor = System.Drawing.Color.Blue;
// txtNewPassword.Text ="";
// txtOldPassword.Text ="";
// txtCrmPassword.Text="";
//要不要清空 , 依需求決定
}
catch(Exception ex)
{
lblmsg.Text="<br>" + ex.InnerException.ToString();
lblmsg.ForeColor = System.Drawing.Color.Red;
}
}
public DirectoryEntry FindEntry(string strUser)
{
DirectoryEntry lEntry = new DirectoryEntry("LDAP://DC=sps,DC=gigupulu,DC=idv,DC=tw");
DirectorySearcher lSearcher = new DirectorySearcher(lEntry);
lSearcher.Filter = "(&(objectClass=user)(sAMAccountName=" + strUser + "))" ;
lSearcher.PropertiesToLoad.Add("Name");
DirectoryEntry lRetEntry = null;
try
{
SearchResult lResult = lSearcher.FindOne();
lRetEntry = lResult.GetDirectoryEntry();
}
catch(Exception ex)
{
lblmsg.Text="<br>" + ex.InnerException.ToString();
lblmsg.ForeColor = System.Drawing.Color.Red;
}
return lRetEntry;
}
//依帳號回傳DirectoryEntry
最後....
protected override void RenderWebPart(HtmlTextWriter output)
{
t.RenderControl(output);
output.Write(sMsg);
}
就大工告成嚕....如果有問題歡迎跟我連絡 , 或是利用討論區討論.
以上代碼歡迎利用轉貼 , 如有修正建議或改版 , 請提供給我...謝謝!
浙公网安备 33010602011771号