使用winform程序控制window服务的操作 c#之添加window服务(定时任务) - 腾讯云开发者社区-腾讯云
在winform项目中编写代码控制服务
1、winform程序添加权限
要控制windows服务的话,程序需要高于一般winform程序的权限。
解决办法:右键winform项目,添加新项,选择应用程序清单文件,默认会建立app.manifest
requestedExecutionLevel:配置权限的地方在这里!默认的是asInvoker,我们修改为requireAdministrator(需要管理员身份!)
首先要在项目中引入两个包:
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;
}
}
}
}
活到老,学到老。