由於公司有許多windows服務進行業務的處理,所以對服務的維護也是一個比較頭痛的問題,因為自己也不知道服務什么時候自動停了,而且更主要的原因是服務都是由運維部門在維護管理,開發這邊沒有直接操作服務的權限,所以利用網頁監控服務就很重要了(在服務中也可以增加郵件提醒,比如服務報錯或者斷掉)。
如何獲取電腦上的所有服務:
使用.Net框架類庫中自帶的組件ServiceController可以實現對 Windows服務的操作。
1、首先要在你的項目添加引用System.ServiceProcess命名空間;
2、創建ServiceController的實例;
//獲取當前計算機上的所有非設備驅動程序服務 ServiceController[] myServices = ServiceController.GetServices();
GetServices方法有一個重載,默認獲取本機的服務,如果想獲取某台機器上的服務,則要指定機器名,前提是要有權限獲取。
由於是用網頁獲取電腦上的所有服務,我就直接貼網頁后台代碼了,如下:
protected void Page_Load(object sender, EventArgs e) { ServiceController[] myServices = ServiceController.GetServices(); list = new List<ServiceModel>(); foreach (var item in myServices) { if (item.ServiceType == ServiceType.Win32OwnProcess) { ServiceModel model = new ServiceModel(); model.ServiceName = item.ServiceName; model.DisplayName = item.DisplayName; if (item.Status == ServiceControllerStatus.Running) model.IsRunning = true; else model.IsRunning = false; list.Add(model); } } }
其中ServiceModel是我新建的一個實體類,用來保存相關服務的信息。前提頁面部分截圖如下:
根據服務的當前狀態,可以對服務進行:停止、啟動、重啟等操作。由於我是根據點擊的操作,傳到一般處理程序進行處理的,所以直接上代碼,很簡單:
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //服務名 string serviceName = context.Request.QueryString["serviceName"]; //操作類型【重啟、停止、重啟】 string type = context.Request.QueryString["type"]; try { switch (type) { case "start": StartService(serviceName); break; case "stop": StopService(serviceName); break; case "reset": ResetService(serviceName); break; default: ResetService(serviceName); break; } context.Response.Write("ok"); } catch (Exception ex) { context.Response.Write(ex.Message); } } /// <summary> /// 啟動服務 /// </summary> /// <param name="serviceName">服務名</param> private void StartService(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); service.Close(); } } /// <summary> /// 停止服務 /// </summary> /// <param name="serviceName">服務名</param> private void StopService(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped); service.Close(); } } /// <summary> /// 重啟服務 /// </summary> /// <param name="serviceName">服務名</param> private void ResetService(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running || service.Status == ServiceControllerStatus.Stopped) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); service.Close(); } }
代碼很簡單,一看簡單明了,呵呵…
開發注意事項:
1、如果用VS調試程序對服務進行停止、啟動等操作的時候,報
解決辦法:關閉VS,用管理員身份運行程序即可解決問題
2、將網頁部署到IIS進行訪問的時候,可能提示沒權限操作等原因:
首先還是介紹下IIS的安裝吧,估計大家對這個都沒問題了
控制面板--->程序和功能--->啟用或關閉Windows功能--->Internet信息服務,如下圖:
由於我用的是Win8,最開始我只勾選了一級目錄,就點擊安裝了,結果運行IIS網站的時候,總是提示403錯誤,后來才發現是IIS安裝不全的問題,請根據上圖勾選即可。
當IIS安裝完全之后,網站可以運行了,但是在操作服務的時候提示權限不足原因,請在IIS設置如下:
我這里是DefaultAppPool程序池,鼠標右擊該程序池-->高級設置,如下如:
標識這里選擇內置賬戶為:LocalSystem,或者選擇自定義賬戶,新建一個有權限的賬號也可以。
再次運行網站,對我們的服務進行停止、啟動等操作,發現一切正常。
以上就是今天在做有關網頁對服務進行操作說遇到的問題,希望能幫到有同樣需求的人。






