1. 程式人生 > >如何通過程式碼實現自動安裝、啟動和解除安裝Windows服務

如何通過程式碼實現自動安裝、啟動和解除安裝Windows服務

首先如何開發自己的Windows服務呢?開啟你的vs,新建一個專案,選擇“Windows服務”,會建立一個Windows服務專案,裡面會包含一個“Service1.cs”檔案,開啟這個檔案,單擊右鍵選擇“檢視程式碼”,程式碼結構如下:

using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;


namespace MyService
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }


        protected override void OnStart(string[] args)    //服務在啟動的時候執行
        {
            File.AppendAllText("D:\\log.txt", "服務啟動……" + DateTime.Now.ToString());
        }


        protected override void OnStop()  //服務在停止的時候執行
        {
            File.AppendAllText("D:\\log.txt", "服務關閉……" + DateTime.Now.ToString());
        }
    }
}

從程式碼可以看出,實際上就是新建一個繼承了“ServiceBase”這個基類的類“Service1”,這個類裡面有兩個重寫的方法體,分別是OnStart和OnStop,我分別在這兩個方法體中實現了兩個功能,

Onstart方法裡面,我會在D盤的log.txt文字檔案裡面插入一段文字,文子內容為“服務啟動.....”+現在的時間

OnStop方法裡面。我同樣的在D盤的log.txt文字檔案裡面插入一段文字,文字內容為“服務關閉....”+現在的時間

OnStart方法是在服務啟動的時候執行,OnStop方法會在服務停止的時候執行。

好了,上面就是如何建立服務的方法,實現的功能很簡單,主要是體會一下如何去建立一個windows服務,此處主要是講如何去安裝、執行和解除安裝服務。

實際上,vs自帶的工具裡面有安裝服務的工具“installutil.exe”,這個是vs提供的工具,用來手動安裝服務,這裡暫時不講如何利用這個工具來安裝服務,不過要提一下利用installutil.exe工具安裝服務,第一次需要手動啟動服務,服務才會跑起來,即便是你已經將服務設定為自動啟動的狀態,也是如此。接下來講一下如何通過程式碼來實現自動安裝、執行和解除安裝服務。

同樣的,我建立一個新的窗體應用程式,這個程式裡面有一個窗體,裡面有四個按鈕,分別是“安裝”、“執行服務”、“停止服務”、“解除安裝”如下圖:


安裝服務的程式碼:

首先是“安裝”按鈕的點選事件如下:

 private void button1_Click(object sender, EventArgs e)
        {
            //Process.Start();
            string path = AppDomain.CurrentDomain.BaseDirectory;            
            path = @"D:\MyService.exe";
            Process.Start("sc", "create myserver1 binpath= \"" + path + "\" displayName= 我的服務 start= auto");
            MessageBox.Show("安裝成功");
        }

在這個方法裡面有個path變數,這個變數存放的就是上面我新建的那個服務的完整路徑(此處我是將上面建的服務放在D盤下面)。這裡安裝服務的方法是用的SC命令,格式如下:sc create [服務名] [binpath=] <option1> <option2> <option3>

解除安裝服務的程式碼如下:

private void button3_Click(object sender, EventArgs e)
        {
            Process.Start("sc", "delete myserver1");
            MessageBox.Show("解除安裝成功");
        }

解除安裝服務的方法也是用SC命令,格式如下:sc delete [服務名]

啟動服務的程式碼如下:

private void button2_Click(object sender, EventArgs e)
        {
            foreach (var service in ServiceController.GetServices())
            {
                if (service.ServiceName == "myserver1")
                {
                    service.Start();
                    break;
                }
            }
            MessageBox.Show("已啟動");
        }

這裡使用ServiceController這個類的方法GetServices()來獲取計算機中所有服務,然後遍歷這個服務結果,找到服務名稱為myserver1的服務,使用服務的Start()方法來啟動服務

停止服務的程式碼如下:

private void button4_Click(object sender, EventArgs e)
        {
            foreach (var service in ServiceController.GetServices())
            {
                if (service.ServiceName == "myserver1")
                {
                    service.Stop();
                    break;
                }
            }
            MessageBox.Show("已停止");
        }

這裡同樣的也是使用ServiceController這個類的方法GetServices()來獲取計算機中所有服務,然後遍歷這個服務結果,找到服務名稱為myserver1的服務,使用服務的Stop()方法來停止服務

好了,現在來看看執行結果如何吧

我們首先開啟“服務”視窗,開啟方式:在“執行”命令輸入框中輸入services.msg,進入到“服務”視窗,如下:


可以看到服務列表最後一個服務是傳真服務,現在我們將我們剛才建立的窗體應用執行起來,然後點選“安裝”按鈕,再來看下“服務”視窗中的服務列表是不是多了一條服務,如下圖


可以看到裡面多了一條“我的服務”這條服務,我們雙擊它看下它的屬性


可以看到服務名稱為“myserver1”,顯示名稱為“我的服務”,可執行檔案的路徑為“D:\MyService.exe”,這和我們在程式碼裡面寫得建立服務的引數完全一致,但是此時服務並沒有啟動起來,接下來看下點選“啟動服務”按鈕會是什麼結果。。。


可以看到服務狀態為“已啟動”,我們再來看下我們建立的服務應用裡面的OnStart()方法裡面做了什麼:

protected override void OnStart(string[] args)
        {
            File.AppendAllText("D:\\log.txt", "服務啟動……" + DateTime.Now.ToString());
        }

是的,我們設定好在服務啟動的時候會在D盤的log.txt檔案裡面新增一段文字,文字內容為“服務啟動....”+時間,我們再來看下D盤裡面有沒有log.txt這個檔案:


開啟看下里面的內容:


然後再點選“停止服務”按鈕,看下發生的結果:



可以看到,在“服務”視窗列表中“我的服務”的狀態已經不是“已啟動”狀態了,在D盤的log.txt檔案裡也多了條記錄

再看下點選“解除安裝”按鈕的結果:


重新整理一下“服務”視窗列表,你會發現“我的服務”那條記錄已經不見了

總結一下:

安裝服務和解除安裝服務,我是用了SC命令,通過Process.Start()方法來執行SC命令,但是服務安裝上去之後並不會自動執行,需要手動的去啟動,所以我們可以用程式碼來實現啟動功能。我們可以呼叫ServiceController.GetServices()這個方法返回本機中所有的服務,然後遍歷返回的結果集,從中找到我們自己建的服務,我們得到的結果是一個ServiceController物件,這個物件提供了服務的啟動和停止的方法,所以我們可以呼叫這兩個方法來實現服務的啟動和停止的功能。