winform安装、启动、停止、卸载windows服务!

4 篇文章 0 订阅

运行环境: .net framework 4

业务需求:在winfrom程序中,控制已经开发好的windows服务(安装、启动、停止、卸载)

开发环境:vs2019

这里我们建立一个解决方案,包含一个windows service项目(windows服务!)和一个winform项目(用来控制windows服务!)。

其中winform加入了对service项目的引用,方便控制service。

目录

1、winform程序添加权限

2、为windows service项目配置安装类

3、在winform项目中编写代码控制服务


1、winform程序添加权限

要控制windows服务的话,程序需要高于一般winform程序的权限。

解决办法:右键winform项目,添加新项,选择应用程序清单文件,默认会建立app.manifest

这里我已经新建过了了一个,所以显示的是app1。

新建成功后,我们打开app.manifest文件,找到下面一行

requestedExecutionLevel:配置权限的地方在这里!默认的是asInvoker,我们修改为requireAdministrator(需要管理员身份!)

2、为windows service项目配置安装类

这里我们windows服务类已经开发完毕,这里我们双击服务类,进入设计页面

在设计页面上右键 => 单机添加安装程序    然后会添加ProjectInstaller.cs!

我们进入ProjectInstaller.cs的设计页面,分别要配置两个地方

1、将serviceProjectInstaller1里面的Account配置为LocalSystem,如下图所示

2、配置服务的名称说明

这里的服务名称非常重要!之后要在winform代码中控制服务,是需要根据服务名称来进行控制的!

3、在winform项目中编写代码控制服务

首先要在项目中引入两个包:

using System.ServiceProcess;//用来控制服务的启动和停止

using System.Configuration.Install;//用来控制服务的安装与卸载

然后我们将服务控制的代码封装到一个工具类中,方便今后复用,直接贴代码

using HJYYDataService.CommonTool;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace HJYYDataService.Helper
{
    /// <summary>
    /// 服务管理工具类 by oycm
    /// 注意:HJYYDataService.CommonTool.LogHelper是自己封装的日志工具类,请替换成自己的日志类
    /// </summary>
    public class ServiceHelper
    {
        //服务的应用程序文件地址,这里放在同一个目录下,方便调用
        private static string ServicePath = $"{AppDomain.CurrentDomain.BaseDirectory}\\HJYYDataService.exe";
        //之前设置好的服务名称
        private const string ServiceName = "HJYYDataService";

        /// <summary>
        /// 安装windows服务
        /// 安装服务前可以先调用方法检测服务是否存在
        /// </summary>
        public static void InstallService()
        {
            try
            {
                using (AssemblyInstaller installer = new AssemblyInstaller())
                {
                    installer.UseNewContext = true;
                    installer.Path = ServicePath;
                    IDictionary savedState = new Hashtable();
                    installer.Install(savedState);
                    installer.Commit(savedState);
                    LogHelper.WriteLog("启动服务成功");
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("启动服务失败"+ex.Message);
                throw;
            }
        }

        /// <summary>
        /// 卸载windows服务
        /// 卸载服务前可以先调用方法检测服务是否存在
        /// </summary>
        public static void UninstallService()
        {
            try
            {
                using (AssemblyInstaller installer = new AssemblyInstaller())
                {
                    installer.UseNewContext = true;
                    installer.Path = ServicePath;
                    installer.Uninstall(null);
                    LogHelper.WriteLog("卸载服务成功");
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("卸载服务失败"+ex.Message);
                throw;
            }
        }

        /// <summary>
        /// 判断服务是否已经安装  注意在和服务相关的功能基本都需要调用
        /// </summary>
        /// <returns></returns>
        public static bool ServiceExists()
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (var item in services)
            {
                if (item.ServiceName.ToLower() == ServiceName.ToLower())
                {
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 服务是否处于运行状态
        /// </summary>
        /// <returns></returns>
        public static bool IsServiceRunning()
        {
            if (!ServiceExists()) return false;
            if (GetServiceState() == ServiceControllerStatus.Running) return true;
            return false;
        }

        /// <summary>
        /// 服务是否处于停止状态
        /// </summary>
        /// <returns></returns>
        public static bool IsServiceStopped()
        {
            if (!ServiceExists()) return false;
            if (GetServiceState() == ServiceControllerStatus.Stopped) return true;
            return false;
        }


        /// <summary>
        /// 停止windows服务
        /// 停止服务前可以先检测服务是否存在、是否处于运行状态
        /// </summary>
        public static void StopService()
        {
            try
            {
                using (ServiceController sc = new ServiceController(ServiceName))
                {
                    if (sc.Status == ServiceControllerStatus.Running)
                    {
                        sc.Stop();
                        LogHelper.WriteLog("停止服务成功");
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("停止服务失败"+ex.Message);
                throw;
            }
        }

        /// <summary>
        /// 启动windows服务
        /// 启动服务前可以先检测服务是否存在、是否处于停止状态
        /// </summary>
        public static void StartService()
        {
            try
            {
                using (ServiceController sc = new ServiceController(ServiceName))
                {
                    if (sc.Status == ServiceControllerStatus.Stopped)
                    {
                        sc.Start();
                        LogHelper.WriteLog("启动服务成功");
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("启动服务失败" + ex.Message);
                throw;
            }
        }

        /// <summary>
        /// 获取windows服务状态
        /// </summary>
        /// <returns></returns>
        private static ServiceControllerStatus GetServiceState()
        {
            using (ServiceController sc = new ServiceController(ServiceName))
            {
                return sc.Status;
            }
        }
    }
}

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值