話說 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); 
  }

就大工告成嚕....如果有問題歡迎跟我連絡 , 或是利用討論區討論.
以上代碼歡迎利用轉貼 , 如有修正建議或改版 , 請提供給我...謝謝!

posted on 2006-12-05 18:58  volitation  阅读(407)  评论(0)    收藏  举报