c#操作windows系统的服务,不要再用 “sc”命令了,直接用c#自带的类进行管理,简单方便,可控性强。
话不多说,直接上代码,主要是用了ServiceController,ConfigService类。
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.InteropServices;
using System.ServiceProcess;
using System.Text;
using System.Threading;
#region 服务相关操作
public class ServiceHelper
{
/// <summary>
/// 监测特定名称的服务是否存在
/// </summary>
/// <param name="serviceName">要检测的服务名称</param>
/// <returns>存在true,不存在false</returns>
public bool CheckService(string serviceName)
{
bool bCheck = false;
//获取windows服务列表
ServiceController[] serviceList = ServiceController.GetServices();
//循环查找该名称的服务
for (int i = 0; i < serviceList.Length; i++)
{
if (serviceList[i].ServiceName.ToString() == serviceName)
{
bCheck = true;
break;
}
}
return bCheck;
}
/// <summary>
/// 开启服务
/// </summary>
/// <param name="serviceName">服务名称</param>
public void StartSrv(string serviceName)
{
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Running)
{
Console.WriteLine("服务已经启动......");
return;
}
if (control.Status == ServiceControllerStatus.Stopped)
{
Console.Write("服务启动");
control.Start();
while (true)
{
Thread.Sleep(20);
Console.Write(".");
if (new ServiceController(serviceName).Status == ServiceControllerStatus.Running) break;
}
Console.WriteLine("服务已经启动");
}
}
}
/// <summary>
/// 停止服务
/// </summary>
/// <param name="serviceName">服务名称</param>
public void StopSrv(string serviceName)
{
using (ServiceController control = new ServiceController(serviceName))
{
if (control.Status == ServiceControllerStatus.Stopped)
{
Console.WriteLine("服务已经停止......");
return;
}
if (control.Status == ServiceControllerStatus.Running)
{
Console.Write("服务停止");
control.Stop();
}
while (new ServiceController(serviceName).Status != ServiceControllerStatus.Stopped)
{
Thread.Sleep(50);
Console.Write(".");
}
Console.WriteLine("服务已经停止");
}
}
/// <summary>
/// 获取服务状态
/// </summary>
/// <param name="serviceName">服务名</param>
/// <returns></returns>
public ServiceControllerStatus GetServiceStatus(string serviceName)
{
ServiceController service = new ServiceController(serviceName);
return service.Status;
}
/// <summary>
/// 服务的安装和删除
/// </summary>
/// <param name="srvName">服务名</param>
/// <param name="srvDisplayName">服务显示名</param>
/// <param name="srvDescription">服务描述</param>
/// <param name="install">是否安装,true安装,false删除</param>
public void ConfigService(string srvName, string srvDisplayName, string srvDescription, bool install)
{
TransactedInstaller ti = new TransactedInstaller();
ti.Installers.Add(new ServiceProcessInstaller
{
Account = ServiceAccount.LocalSystem
});
ti.Installers.Add(new ServiceInstaller
{
ServiceName = srvName,
DisplayName = srvDisplayName,
Description = srvDescription,
StartType = ServiceStartMode.Automatic//运行方式
});
ti.Context = new InstallContext();
//取当前可执行文件路径,加上"s"参数,以windows服务启动程序
ti.Context.Parameters["assemblypath"] = "\"" + Assembly.GetEntryAssembly().Location + "\" s";
if (install) //安装
{
ti.Install(new Hashtable());
}
else
{
ti.Uninstall(null);//卸载
}
}
/// <summary>
/// 安装服务,并启动
/// </summary>
/// <param name="srvName">服务名</param>
/// <param name="srvDisplayName">服务显示名</param>
/// <param name="srvDescription">服务描述</param>
public void SafeInstallRunService(string srvName, string srvDisplayName, string srvDescription)
{
//安装服务
ConfigService(srvName, srvDisplayName, srvDescription, true);
//启动服务
StartSrv(srvName);
}
/// <summary>
/// 停止服务,再删除服务
/// </summary>
/// <param name="serviceName"></param>
public void SafeUnistallService(string serviceName)
{
//停止服务
StopSrv(serviceName);
//如果服务已经停止,删除服务
if (new ServiceController(serviceName).Status == ServiceControllerStatus.Stopped)
{
Console.WriteLine("服务删除中...", "");
//删除服务
ConfigService(serviceName, null, null, false);
}
//等待40秒,待系统相关服务真正把服务删除
bool bSrvExisted = CheckService(serviceName);
for (int ii = 0; ii < 40; ii++)
{
if (!bSrvExisted) break;
Thread.Sleep(1000);
Console.Write(".");
bSrvExisted = CheckService(serviceName);
}
Console.WriteLine("");
}
}
#endregion 服务相关操作结束