在平時的工作中經常會遇到檢測或設置系統服務的情況,一般來說我們主要會遇到以下幾種操作使用場景:
1、獲取系統所有服務
2、檢測某個服務狀態是否啟動
3、設置某個服務狀態:啟動、停止、暫停、恢復
4、獲取某個服務的狀態
所以比較方便的就是自己封裝一個類,可以隨心所欲的調用,不用每次都去編寫同樣的代碼。現在就自己遇到的情況,將操作系統服務的類實現:
系統服務類:systServiceMng
其實其核心是通過引用系統中的對應版本的System.ServiceProcess.dll(需要與你引用的項目框架版本一致),通過其中的ServiceController來映射到系統服務實例
提供了一些公用方法和屬性可以設置和獲取服務狀態。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.ServiceProcess; ///made by george ///date:2014-05-30 ///QQ:709617880 namespace systemServiceMng { //設置操作枚舉類型 public enum opertType{ start,stop,pause,reStart }; public class systServiceMng { /// <summary> /// 獲取系統所有服務對象 /// </summary> /// <returns></returns> public ArrayList getAllsystemServices() { ArrayList arryServices = new ArrayList(); ServiceController[] services = ServiceController.GetServices(); foreach(ServiceController a in services){ arryServices.Add(a); } return arryServices; } /// <summary> /// 獲取所有服務名,返回list /// </summary> /// <returns></returns> public List<String> getAllServiceNames() { List<String> listNames = new List<String>(); ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController a in services) { listNames.Add(a.DisplayName); } return listNames; } /// <summary> /// 設置指定服務 /// </summary> /// <param name="serviceName">服務顯示名</param> /// <param name="oper">操作類型</param> /// <returns>true 設置成功,false設置失敗</returns> public Boolean setService(string serviceName,opertType oper) { Boolean isok = false; ServiceController[] allServices = System.ServiceProcess.ServiceController.GetServices(); foreach (ServiceController sc in allServices) { if (sc.DisplayName.Trim() == serviceName.Trim()) { if (oper.ToString() == "start") { sc.Start(); if (sc.Status.ToString() == "Running") isok = true; } if (oper.ToString() == "stop") { sc.Stop(); if (sc.Status.ToString() == "Stopped") isok = true; } if (oper.ToString() == "pause") { sc.Pause(); if (sc.Status.ToString() == "Pause") isok = true; } if (oper.ToString() == "reStart") { sc.Continue(); if (sc.Status.ToString() == "Running") isok = true; } } } return isok; } /// <summary> /// 檢測服務狀態 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public Boolean checkServiceIsRunning(string serviceName) { ServiceController[] allServices = System.ServiceProcess.ServiceController.GetServices(); Boolean runing = false; foreach (ServiceController sc in allServices) { if (sc.DisplayName.Trim() == serviceName.Trim()) { if (sc.Status.ToString() == "Running") { runing= true; } } } return runing; } /// <summary> /// 獲取服務狀態 /// </summary> /// <param name="serviceName">服務顯示名</param> /// <returns></returns> public String getStatue(string serviceName) { ServiceController[] allServices = System.ServiceProcess.ServiceController.GetServices(); foreach (ServiceController sc in allServices) { if (sc.DisplayName.Trim() == serviceName.Trim()) { return sc.Status.ToString(); } } return ""; } } }
注意:每一個服務有一個CanXXX的屬性如:CanStop,CanShouDown……,在設置服務啟動、停止、暫停、恢復 前需要判斷該屬性是否可設置,否則會報錯。
可以寫一個簡單的winForm來操作系統服務,也是一個小工具,直接可以設置系統服務。
【下期預告】: C#玩轉計算機系列-操作IIS服務