2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > .net

使用工具安装,运行,停止,卸载Window服务

时间:06-21来源:作者:点击数:30
CDSY,CDSY.XYZ

WSWinForm.exe介绍

WSWinForm.exe是一个实用的小工具,用于将任何EXE程序作为Windows服务运行。也就是说WSWinForm只是其注册程序的服务外壳,这个特性对于我们来说非常实用,我们可以通过它来安装,运行,停止,卸载Windows服务,而不再是通过命令行InstallUtil的方式来安装。

资源下载

你可以通过本文下载。

应用程序

源代码

GitHub地址:https://github.com/CrazyJson/TaskManager

SVN地址:http://code.taobao.org/svn/TaskManagerPub/Branch

如何使用

下载完软件以后,我们能干些什么呢?看看这个截图吧:。

这里可以看到的操作:

1. 安装指定路径的服务,

2. 运行指定服务,

3. 停止正在运行的服务,

4. 卸载服务,

这些功能是怎么通过代码来实现的呢,我后面再说。先对它有个印象就可以了。

代码解析

1.安装功能:

  • string[] cmdline = { };
  • string serviceFileName = txtPath.Text.Trim();
  • string serviceName = GetServiceName(serviceFileName);
  • if (string.IsNullOrEmpty(serviceName))
  • {
  • txtTip.Text = "指定文件不是Windows服务!";
  • return;
  • }
  • if (ServiceIsExisted(serviceName))
  • {
  • txtTip.Text = "要安装的服务已经存在!";
  • return;
  • }
  • TransactedInstaller transactedInstaller = new TransactedInstaller();
  • AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);
  • transactedInstaller.Installers.Add(assemblyInstaller);
  • transactedInstaller.Install(new System.Collections.Hashtable());
  • txtTip.Text = "服务安装成功!";

上面这段代码中最为中要的部分是方法GetServiceName,通过给定路径获取服务的名称。下面来看看这个方法是怎么实现的。

  • /// <summary>
  • /// 获取Windows服务的名称
  • /// </summary>
  • /// <param name="serviceFileName">文件路径</param>
  • /// <returns>服务名称</returns>
  • private string GetServiceName(string serviceFileName)
  • {
  • try
  • {
  • Assembly assembly = Assembly.LoadFrom(serviceFileName);
  • Type[] types = assembly.GetTypes();
  • foreach (Type myType in types)
  • {
  • if (myType.IsClass && myType.BaseType == typeof(System.Configuration.Install.Installer))
  • {
  • FieldInfo[] fieldInfos = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default | BindingFlags.Instance | BindingFlags.Static);
  • foreach (FieldInfo myFieldInfo in fieldInfos)
  • {
  • if (myFieldInfo.FieldType == typeof(System.ServiceProcess.ServiceInstaller))
  • {
  • ServiceInstaller serviceInstaller = (ServiceInstaller)myFieldInfo.GetValue(Activator.CreateInstance(myType));
  • return serviceInstaller.ServiceName;
  • }
  • }
  • }
  • }
  • return "";
  • }
  • catch (Exception ex)
  • {
  • throw ex;
  • }
  • }

1.加载程序集

2.获取程序集里面继承于System.Configuration.Install.Installer这个类的类,原因在于Windows服务都需要添加一个安装程序,而安装程序是继承这个类的,

安装以后的服务名称是通过这个类ServiceInstaller的变量指定的,比如ServiceInstaller.ServiceName = "xxx";

3.获取第二步Installer类里面的ServiceInstaller变量的值,然后获取这个值的ServiceName属性就是服务的名称。

2.运行功能:

  • try
  • {
  • string serviceName = GetServiceName(txtPath.Text.Trim());
  • if (string.IsNullOrEmpty(serviceName))
  • {
  • txtTip.Text = "指定文件不是Windows服务!";
  • return;
  • }
  • if (!ServiceIsExisted(serviceName))
  • {
  • txtTip.Text = "要运行的服务不存在!";
  • return;
  • }
  • ServiceController service = new ServiceController(serviceName);
  • if (service.Status != ServiceControllerStatus.Running && service.Status != ServiceControllerStatus.StartPending)
  • {
  • service.Start();
  • txtTip.Text = "服务运行成功!";
  • }
  • else
  • {
  • txtTip.Text = "服务正在运行!";
  • }
  • }
  • catch (Exception ex)
  • {
  • txtTip.Text = ex.InnerException.ToString();
  • }

重要的是ServiceController这个类,这个类可以获取系统中所有的服务

  • /// <summary>
  • /// 判断服务是否已经存在
  • /// </summary>
  • /// <param name="serviceName">服务名称</param>
  • /// <returns>bool</returns>
  • private bool ServiceIsExisted(string serviceName)
  • {
  • ServiceController[] services = ServiceController.GetServices();
  • foreach (ServiceController s in services)
  • {
  • if (s.ServiceName == serviceName)
  • {
  • return true;
  • }
  • }
  • return false;
  • }

3.停止功能:

  • try
  • {
  • string[] cmdline = { };
  • string serviceFileName = txtPath.Text.Trim();
  • string serviceName = GetServiceName(serviceFileName);
  • if (string.IsNullOrEmpty(serviceName))
  • {
  • txtTip.Text = "指定文件不是Windows服务!";
  • return;
  • }
  • if (!ServiceIsExisted(serviceName))
  • {
  • txtTip.Text = "要停止的服务不存在!";
  • return;
  • }
  • ServiceController service = new ServiceController(serviceName);
  • if (service.Status == ServiceControllerStatus.Running)
  • {
  • service.Stop();
  • txtTip.Text = "服务停止成功!";
  • }
  • else
  • {
  • txtTip.Text = "服务已经停止!";
  • }
  • }
  • catch (Exception ex)
  • {
  • txtTip.Text = ex.InnerException.ToString();
  • }

4.卸载功能:

  • try
  • {
  • string[] cmdline = { };
  • string serviceFileName = txtPath.Text.Trim();
  • string serviceName = GetServiceName(serviceFileName);
  • if (string.IsNullOrEmpty(serviceName))
  • {
  • txtTip.Text = "指定文件不是Windows服务!";
  • return;
  • }
  • if (!ServiceIsExisted(serviceName))
  • {
  • txtTip.Text = "要卸载的服务不存在!";
  • return;
  • }
  • TransactedInstaller transactedInstaller = new TransactedInstaller();
  • AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);
  • transactedInstaller.Installers.Add(assemblyInstaller);
  • transactedInstaller.Uninstall(null);
  • txtTip.Text = "服务卸载成功!";
  • }
  • catch (Exception ex)
  • {
  • txtTip.Text = ex.InnerException.ToString();
  • }

总结

1.整体来说实现了服务的整个功能,可以方便的运行停止服务,而不再是使用命令行的方式。

2.后续文章将讲解,使用Windows服务实现任务处理(及定时执行某个功能)。

CDSY,CDSY.XYZ
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐