如何通過程式碼實現自動安裝、啟動和解除安裝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物件,這個物件提供了服務的啟動和停止的方法,所以我們可以呼叫這兩個方法來實現服務的啟動和停止的功能。