本文介绍如何使用WMI来判断服务是否存在、如何创建新服务,删除服务、如何启服务、停服务

代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.Threading;

namespace TJVictor.WMI
{
    public class Win32_Service:WMIBaseClass
    {
        #region Property
        private bool completed = false;
        private int timeout = 30;
        public int TimeOut
        {
            get { return timeout; }
            set { timeout = value; }
        }

private string wqlSelect = string.Empty;
        #endregion

#region Construction
        public Win32_Service()
            : base()
        {
            wqlSelect = "select * FROM Win32_Service where Name='{0}'";
            base.Connection();
        }

public Win32_Service(string domain, string Ip, string user, string psd)
            : base(domain, Ip, user, psd)
        {
            wqlSelect = "select * FROM Win32_Service where Name='{0}'";
            base.Connection();
        }
        #endregion

#region public function
        public bool IsServiceExist(string name)
        {
            
            if (!GetSelectQueryCollection(wqlSelect,name).Count.Equals(0))
                return true;
            return false;
        }

public void StartService(string name)
        {
            if(!IsServiceExist(name))
                throw new TJVictor.WMI.WmiException.ServiceException(string.Format("{0} 服务不存在",name));
            object result = string.Empty;
            ManagementObjectSearcher mos = GetObjectSearcher(wqlSelect, name);
            foreach (ManagementObject mo in mos.Get())
            {
                result = mo.InvokeMethod("StartService", null);
                break;
            }
            CheckExceptionClass.CheckServiceException(int.Parse(result.ToString()));
            TestServiceState(mos, "Running", string.Format("{0} 服务在 {1} 机器上启动失败,启动超时",name,base.Ip));
        }

public void StopService(string name)
        {
            if (!IsServiceExist(name))
                throw new TJVictor.WMI.WmiException.ServiceException(string.Format("{0} 服务不存在", name));
            object result = string.Empty;
            ManagementObjectSearcher mos = GetObjectSearcher(wqlSelect, name);
            foreach (ManagementObject mo in mos.Get())
            {
                result = mo.InvokeMethod("StopService", null);
                break;
            }
            CheckExceptionClass.CheckServiceException(int.Parse(result.ToString()));
            TestServiceState(mos, "Stopped", string.Format("{0} 服务在 {1} 机器上停止失败,停止超时", name, base.Ip));
        }

public void CreateService(string name, string displayName, string startMode, string pathName, string startName, string startPassword,
            string serviceType)
        {
            if(IsServiceExist(name))
                throw new TJVictor.WMI.WmiException.ServiceException(string.Format("{0} 服务已经存在",name));

int tempTimeout = this.timeout;
            ManagementClass processClass = new ManagementClass("Win32_Service");
            processClass.Scope = base.Scope;

string method = "Create";
            ManagementBaseObject inputArgs = processClass.GetMethodParameters(method);
            inputArgs["Name"] = name;
            inputArgs["DisplayName"] = displayName;
            inputArgs["StartMode"] = startMode;
            inputArgs["PathName"] = pathName;
            if (!startName.Equals(string.Empty))
            {
                inputArgs["StartName"] = startName;
                inputArgs["StartPassword"] = startPassword;
            }
            ManagementBaseObject ob = processClass.InvokeMethod(method, inputArgs, null);
            CheckExceptionClass.CheckServiceException(int.Parse(ob["returnValue"].ToString()));

//检测服务是否已经安装成功
            while (!IsServiceExist(name))
            {
                if (tempTimeout.Equals(0))
                {
                    throw new TJVictor.WMI.WmiException.ServiceException(
                        string.Format("在 {0} 上安装 {1} 服务超时", base.Ip, name));
                }
                Thread.Sleep(1000);
                tempTimeout--;
            } 
        }

public void DeleteService(string name)
        {
            object result = string.Empty;
            if(!IsServiceExist(name))
                throw new TJVictor.WMI.WmiException.ServiceException(string.Format("{0} 服务不存在",name));
            foreach (ManagementObject mo in GetSelectQueryCollection(wqlSelect, name))
            {
                result = mo.InvokeMethod("delete", null);
                break;
            }
            //检测卸载命令是否执行成功
            CheckExceptionClass.CheckServiceException(int.Parse(result.ToString()));
            //检测服务是否已经卸载成功
            int tempTimeout = this.timeout;
            while (IsServiceExist(name))
            {
                if (tempTimeout.Equals(0))
                {
                    throw new TJVictor.WMI.WmiException.ServiceException(
                        string.Format("在 {0} 上卸载 {1} 服务超时", base.Ip, name));
                }
                Thread.Sleep(1000);
                tempTimeout--;
            }
        }
        #endregion

#region private function
        private void TestServiceState(ManagementObjectSearcher mos, string state,string errorMes)
        {
            completed = false;
            int tempTimeout = timeout;
            while (!completed)
            {
                if (tempTimeout.Equals(0))
                {
                    throw new TJVictor.WMI.WmiException.ServiceException(errorMes);
                }
                foreach (ManagementObject mo in mos.Get())
                {
                    if (mo["State"].ToString().Equals(state))
                    {
                        completed = true;
                    }
                    break;
                }
                Thread.Sleep(1000);
                tempTimeout--;
            }
        }
        #endregion
    }
}

如需转载,请注明本文原创自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor

使用WMI来控制Windows服务相关推荐

  1. asp.net 控制windows服务

    asp.net 控制windows服务 最近做一个小的项目,经理要求winform与web都可操作.于是将其做成服务,winform下调用很简单.asp.net下大部分过程是一样的.但需要涉及到用户的 ...

  2. C#使用ServiceController控制windows服务

    C#中,使用ServiceController类控制windows服务,使用之前要先添加引用:System.ServiceProcess,然后在命名空间中引用:using System.Service ...

  3. Windows 服务监控工具

    在任何企业中,Windows 服务都是面向业务的应用程序的核心组件.这些 Windows 服务的有效运行对于防止网络和应用程序停机至关重要.这使得 Windows 服务监视成为任何网络管理策略的关键部 ...

  4. 编程打开Windows服务控制管理器

    假设要自己编程来加载Windows下后缀为.sys的驱动程序:首先要使用 OpenSCManager 函数打开Windows服务控制管理器: 下面先来调用此函数看一下会不会打开成功:代码如下: #in ...

  5. 启动windows服务时出现“错误1053:服务没有及时响应启动或控制请求”的解决方法

    服务器:windows server 20012 r2 windows服务已经正常安装成功,在"计算机管理->服务" 里面可以看到,但是启动服务的时候报"错误105 ...

  6. Windows服务没有及时响应启动或控制请求1053

    参考链接: 解决"指定的服务已经标记为删除"问题 服务没有及时响应启动或控制请求 1053 关闭服务后,重新启动windows服务报错:"服务没有及时响应启动或控制请求 ...

  7. windows服务安装启动报错误1053:服务没有及时响应启动或控制请求

    用.net 开发了一个C#语言的windows服务,在本地和测试环境,安装启动都正常,在新的线上环境报错,不能启动-报出-错误1053:服务没有及时响应启动或控制请求. 解决办法: 在App.conf ...

  8. wmi java_Java用wmi4j远程管理Windows服务

    wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行脚本等等. wmi ...

  9. Windows服务优化(整理篇)

    如何查看正在启用的Windows服务项目 ①以WinXP为例,首先你要使用系统管理员账户或以拥有Administrator权限的用户身份登录,"运行 cmd.exe"命令,再输入& ...

最新文章

  1. K-Means算法理论及Python实现
  2. Zenoss学习杂记(十)
  3. vc6.0连接mysql数据库
  4. Spring Bean的装配(非XML文件方式)
  5. snmp 获取mac add table_R语言学习笔记(1)数据获取与数据重塑的第一部分
  6. html 转word c#,c#操作word类,进行html和word文档的互相转换
  7. maven 多模块项目
  8. excel匹配_「最全」Excel中查找匹配函数
  9. Android第二十四期 - 游戏公告跑马灯效果
  10. python3 写九九乘法表(python 小白进阶之旅)
  11. 【vuejs面试题】务必熟知的vuejs面试题「务必收藏」
  12. 血压预测常用数据集整理
  13. JS 生成英文字母 A-Z
  14. Java 基础类库:System、Runtime、Object、Math、日期、时间
  15. Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
  16. 计算机逆向工程专业,计算机软件反向工程的合法性研究
  17. 计算机启动键,U启动U盘启动盘一键启动按键大全
  18. mysql 创建事件_MySQL创建事件(CREATE EVENT)
  19. 计算机系的的毕业感言,计算机班同学的毕业感言
  20. Burg法参数化功率谱估计(Python实现版)

热门文章

  1. Android 上拉,下拉刷新。RecyclerView的使用(最后附完整代码)
  2. 百度红包预热活动被封锁
  3. 一篇教会你,Redis主从、哨兵、 Cluster集群。
  4. Android IMS 语音通话 vs 视频通话 vs 视频彩铃
  5. BUCK在轻载下的工作模式
  6. Xilinx FPGA 的快速启动
  7. 神经网络(从手撕到工具包)
  8. 世界公认十大健康水果
  9. INTEL RealSense-D415 在 Ubuntu 16.04 开发流程 4
  10. c语言辗转相除法约分分数,更相损减法和辗转相除法 求最大公约数和最小公倍数(C语言)...