日期:2014-06-10  浏览次数:20507 次

   在平时的工作中经常会遇到检测或设置系统服务的情况,一般来说我们主要会遇到以下几种操作使用场景:

   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服务