本文概述
服务几乎就是任何其他应用程序, 服务和其他程序之间的唯一区别是它们在后台运行, 并且没有可单击或点击的用户界面。在本文中, 你将学习如何在Windows中轻松验证服务是否存在, 如何根据需要在WinForms应用程序中启动或停止该服务。
1.添加对ServiceProcess.dll的引用
为了停止或启动服务, 我们将需要ServiceController类。此类表示Windows服务, 并允许你连接到正在运行或已停止的服务, 对其进行操作或获取有关其的信息。此函数包含在System.ServiceProcess.dll程序集中, 不能与你的代码直接导入到类中。
第一步, 在解决方案资源管理器中右键单击你的项目, 然后选择”添加”, 然后从下拉菜单中选择”引用”。
现在, 从紧急窗口转到左侧的Framework选项卡, 然后在列表中搜索System.ServiceProcess选项。选择它, 然后单击确定。
现在应该将DLL导入你的项目中并可以使用了。
2.导入类
使用类顶部的using指令导入以下类型:
using System.ServiceProcess;
现在, 你将能够使用我们启动或停止服务所需的ServiceController类。
3.功能
现在, 使用ServiceController类通过Windows服务完成所有可能的任务, 如以下示例所示
注意
记住使用System.ServiceProcess添加;在你班级的顶部, 以访问服务班级。此外, 所有这些方法都可以使用该服务的名称, 你可以在打开services.msc的Windows中看到所有已安装服务的列表。
A.验证服务是否存在
要验证服务是否存在, 可以创建以下自定义bool方法, 以其名称验证服务是否存在:
/// <summary>
/// Verify if a service exists
/// </summary>
/// <param name="ServiceName">Service name</param>
/// <returns></returns>
public bool serviceExists(string ServiceName)
{
return ServiceController.GetServices().Any(serviceController => serviceController.ServiceName.Equals(ServiceName));
}
它可以很容易地用作:
if (serviceExists("mysql"))
{
Console.WriteLine("Service exists");
}
else
{
Console.WriteLine("Service doesn't exists");
}
B.启动服务
使用以下方法以其名称启动服务:
/// <summary>
/// Start a service by it's name
/// </summary>
/// <param name="ServiceName"></param>
public void startService(string ServiceName)
{
ServiceController sc = new ServiceController();
sc.ServiceName = ServiceName;
Console.WriteLine("The {0} service status is currently set to {1}", ServiceName, sc.Status.ToString());
if (sc.Status == ServiceControllerStatus.Stopped)
{
// Start the service if the current status is stopped.
Console.WriteLine("Starting the {0} service ...", ServiceName);
try
{
// Start the service, and wait until its status is "Running".
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);
// Display the current service status.
Console.WriteLine("The {0} service status is now set to {1}.", ServiceName , sc.Status.ToString());
}
catch (InvalidOperationException e)
{
Console.WriteLine("Could not start the {0} service.", ServiceName);
Console.WriteLine(e.Message);
}
}
else
{
Console.WriteLine("Service {0} already running.", ServiceName);
}
}
C.停止服务
使用以下方法按名称停止已安装的服务:
/// <summary>
/// Stop a service that is active
/// </summary>
/// <param name="ServiceName"></param>
public void stopService(string ServiceName)
{
ServiceController sc = new ServiceController();
sc.ServiceName = ServiceName;
Console.WriteLine("The {0} service status is currently set to {1}", ServiceName , sc.Status.ToString());
if (sc.Status == ServiceControllerStatus.Running)
{
// Start the service if the current status is stopped.
Console.WriteLine("Stopping the {0} service ...", ServiceName);
try
{
// Start the service, and wait until its status is "Running".
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
// Display the current service status.
Console.WriteLine("The {0} service status is now set to {1}.", ServiceName, sc.Status.ToString());
}
catch (InvalidOperationException e)
{
Console.WriteLine("Could not stop the {0} service.", ServiceName);
Console.WriteLine(e.Message);
}
}
else
{
Console.WriteLine("Cannot stop service {0} because it's already inactive.", ServiceName);
}
}
D.验证服务是否处于活动状态
如你所见, 在以前的方法中, 你无法启动已经处于活动状态的服务或停止已经处于非活动状态的服务。如果你正在使用”重新启动服务”功能, 则可以创建以下方法来验证服务是否正在运行:
/// <summary>
/// Verify if a service is running.
/// </summary>
/// <param name="ServiceName"></param>
public bool serviceIsRunning(string ServiceName)
{
ServiceController sc = new ServiceController();
sc.ServiceName = ServiceName;
if (sc.Status == ServiceControllerStatus.Running)
{
return true;
}
else
{
return false;
}
}
E.重新启动服务
要重新启动服务, 你将需要类中包含的所有先前方法:
/// <summary>
/// Reboots a service
/// </summary>
/// <param name="ServiceName"></param>
public void rebootService(string ServiceName)
{
if (serviceExists(ServiceName))
{
if (serviceIsRunning(ServiceName))
{
stopService(ServiceName);
}
else
{
startService(ServiceName);
}
}else
{
Console.WriteLine("The given service {0} doesn't exists", ServiceName);
}
}
并像这样使用它:
rebootService("mysql");
编码愉快!
评论前必须登录!
注册