在 Winodws 作業系統上有許多服務 (Windows Service),在服務意外中斷時(非正常停止服務的情況下),我們會希望系統做一些處理或提醒。

從「開始」→「所有程式」→「系統管理工具」→「服務」,或直接在「開始」→「執行」中輸入「services.msc」,可以列出所有的服務,找出我們想要設定的服務,按下右鍵→「內容」→切到「修復」頁籤,可以看到系統已經提供幾種預設的處理方式了。

為了要能夠寄信,我們會使用到裡面的「執行程式」這個選項。在進行服務這邊的設定之前,先準備一支會送信的程式。寄信的方式如同以前提到的,可以利用 System.Net.Mail 來發送信件。為了能夠增加程式的彈性,我們可以藉由傳入參數的方式來取得信件的收件人與信件內容,方法就像這樣:

        static void test(params string[] args)
        {
            string strMail="";
            string strMsg="";

            foreach (string s in args)
            {
                if (s.StartWith("/mail:")) { strMail = s.Substring(6); }
                if (s.StartWith("/msg:")) { strMsg = s.Substring(6); }
            }

            try
            {
                MailMessage newMail = new MailMessage();

                newMail.To.Add(strMail);
                newMail.From = new MailAddress("abc@___.com", "Hi Co.", System.Text.Encoding.UTF8);

                newMail.Subject = "(Notice)Error!";
                newMail.SubjectEncoding = Encoding.UTF8;

                newMail.Body = strMsg;
                newMail.BodyEncoding = Encoding.UTF8;

                SmtpClient client = new SmtpClient("127.0.0.1");
                client.Send(newMail);
            }
            catch (Exception ex) { Console.WriteLine("Send mail failed!\n" + ex.Message); }
        }



我把這支程式做成 mail.exe。然後,為了測試,我也開一個服務專案,做一個叫做 TestService.exe 的服務。手動安裝這個服務可以使用 Visual Studio Tools 的「Visual Studio 2005 命令提示字元」,找到服務的位置,註冊 TestService.exe 這個服務。

D:\installutil TestService.exe

如果要卸載這個服務,就加上 /u 參數。

D:\installutil /u TestService.exe



準備好測試用的服務以後,回到「服務」裡設定它的設定值。在這篇文章一開始提到的「修復」頁籤裡,有「第一次失敗時」、「第二次失敗時」、「後續失敗時」的處理對策,我在這邊都設成「執行程式」。然後,在底下「程式(P)」的文字方塊裡,輸入forcedos.exe。

接著,在「命令列參數(C)」設定「/D C:\ test.bat」。test.bat 這支批次檔裡就寫了「sendmail /mail:test@___.com /msg:"test"」。會再額外指給一個批次檔,是因為我在測試時感覺好像一口氣丟太多參數給命令列似乎不管用,所以這麼做。

我測試的方法不太聰明,就是從 Windows 工作管理員找出 TestService.exe 後按下「結束處理程序」。我測試時發現直接停用服務是沒有用的,在設計 TestService.exe 時在裡頭塞會拋出 Exception 的段落也沒用,我猜是得讓服務「正常啟動,並且非正常停用」的狀態下才會跑到「修復」裡的那些失敗事件。

創作者介紹
創作者 fannys23 的頭像
fannys23

小攻城師的戰場筆記

fannys23 發表在 痞客邦 留言(0) 人氣()