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

简介: 本文转载:http://www.cnblogs.com/yanweidie/p/3542670.html WSWinForm.exe介绍       WSWinForm.exe是我自己开发的一个实用的小工具,用于将任何EXE程序作为Windows服务运行。

本文转载:http://www.cnblogs.com/yanweidie/p/3542670.html

WSWinForm.exe介绍

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

资源下载

      你可以通过本文下载。

  应用程序

  源代码

如何使用

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

 

这里可以看到的操作:

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

2. 运行指定服务,

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

4. 卸载服务,

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

代码解析

1.安装功能:

复制代码
 1                 string[] cmdline = { };
 2                 string serviceFileName = txtPath.Text.Trim();  3 string serviceName = GetServiceName(serviceFileName);  4 if (string.IsNullOrEmpty(serviceName))  5  {  6 txtTip.Text = "指定文件不是Windows服务!";  7 return;  8  }  9 if (ServiceIsExisted(serviceName)) 10  { 11 txtTip.Text = "要安装的服务已经存在!"; 12 return; 13  } 14 TransactedInstaller transactedInstaller = new TransactedInstaller(); 15 AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline); 16  transactedInstaller.Installers.Add(assemblyInstaller); 17 transactedInstaller.Install(new System.Collections.Hashtable()); 18 txtTip.Text = "服务安装成功!"; 
复制代码

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

复制代码
 1  /// <summary>
 2         /// 获取Windows服务的名称  3 /// </summary>  4 /// <param name="serviceFileName">文件路径</param>  5 /// <returns>服务名称</returns>  6 private string GetServiceName(string serviceFileName)  7  {  8 try  9  { 10 Assembly assembly = Assembly.LoadFrom(serviceFileName); 11 Type[] types = assembly.GetTypes(); 12 foreach (Type myType in types) 13  { 14 if (myType.IsClass && myType.BaseType == typeof(System.Configuration.Install.Installer)) 15  { 16 FieldInfo[] fieldInfos = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default | BindingFlags.Instance | BindingFlags.Static); 17 foreach (FieldInfo myFieldInfo in fieldInfos) 18  { 19 if (myFieldInfo.FieldType == typeof(System.ServiceProcess.ServiceInstaller)) 20  { 21 ServiceInstaller serviceInstaller = (ServiceInstaller)myFieldInfo.GetValue(Activator.CreateInstance(myType)); 22 return serviceInstaller.ServiceName; 23  } 24  } 25  } 26  } 27 return ""; 28  } 29 catch (Exception ex) 30  { 31 throw ex; 32  } 33 }
复制代码

 1.加载程序集

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

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

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

 2.运行功能:

复制代码
 1 try
 2             {
 3                 string serviceName = GetServiceName(txtPath.Text.Trim());  4 if (string.IsNullOrEmpty(serviceName))  5  {  6 txtTip.Text = "指定文件不是Windows服务!";  7 return;  8  }  9 if (!ServiceIsExisted(serviceName)) 10  { 11 txtTip.Text = "要运行的服务不存在!"; 12 return; 13  } 14 ServiceController service = new ServiceController(serviceName); 15 if (service.Status != ServiceControllerStatus.Running && service.Status != ServiceControllerStatus.StartPending) 16  { 17  service.Start(); 18 txtTip.Text = "服务运行成功!"; 19  } 20 else 21  { 22 txtTip.Text = "服务正在运行!"; 23  } 24  } 25 catch (Exception ex) 26  { 27 txtTip.Text = ex.InnerException.ToString(); 28 }
复制代码

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

复制代码
 1         /// <summary>
 2         /// 判断服务是否已经存在  3 /// </summary>  4 /// <param name="serviceName">服务名称</param>  5 /// <returns>bool</returns>  6 private bool ServiceIsExisted(string serviceName)  7  {  8 ServiceController[] services = ServiceController.GetServices();  9 foreach (ServiceController s in services) 10  { 11 if (s.ServiceName == serviceName) 12  { 13 return true; 14  } 15  } 16 return false; 17 }
复制代码

 3.停止功能:

复制代码
 1 ry
 2             {
 3                 string[] cmdline = { };  4 string serviceFileName = txtPath.Text.Trim();  5 string serviceName = GetServiceName(serviceFileName);  6 if (string.IsNullOrEmpty(serviceName))  7  {  8 txtTip.Text = "指定文件不是Windows服务!";  9 return; 10  } 11 if (!ServiceIsExisted(serviceName)) 12  { 13 txtTip.Text = "要停止的服务不存在!"; 14 return; 15  } 16 ServiceController service = new ServiceController(serviceName); 17 if (service.Status == ServiceControllerStatus.Running) 18  { 19  service.Stop(); 20 txtTip.Text = "服务停止成功!"; 21  } 22 else 23  { 24 txtTip.Text = "服务已经停止!"; 25  } 26 27  } 28 catch (Exception ex) 29  { 30 txtTip.Text = ex.InnerException.ToString(); 31 }
复制代码

4.卸载功能:

复制代码
 1  try
 2             {
 3                 string[] cmdline = { };  4 string serviceFileName = txtPath.Text.Trim();  5 string serviceName = GetServiceName(serviceFileName);  6 if (string.IsNullOrEmpty(serviceName))  7  {  8 txtTip.Text = "指定文件不是Windows服务!";  9 return; 10  } 11 if (!ServiceIsExisted(serviceName)) 12  { 13 txtTip.Text = "要卸载的服务不存在!"; 14 return; 15  } 16 TransactedInstaller transactedInstaller = new TransactedInstaller(); 17 AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline); 18  transactedInstaller.Installers.Add(assemblyInstaller); 19 transactedInstaller.Uninstall(null); 20 txtTip.Text = "服务卸载成功!"; 21 22  } 23 catch (Exception ex) 24  { 25 txtTip.Text = ex.InnerException.ToString(); 26 }
复制代码

 

总结

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

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

 

目录
相关文章
electron打包的exe程序,点击安装却执行了卸载的问题
在window平台下 electron打包的exe安装后,在没卸载的情况下,重新点击exe安装,会执行卸载,再点一次才是安装; 针对这个问题,我注释了打包里的一个配置,就好了,如下
252 0
win10 下提示“请等待当前程序完成卸载或更改”解决方案
当我们打开控制面板选择程序和功能进行程序卸载的时候,一旦当你当前的程序卸载还未完成时,你又去卸载另一个程序的时候,就会出现如下的提示“请等待当前程序完成卸载或更改”
904 0
win10 下提示“请等待当前程序完成卸载或更改”解决方案
|
网络协议 Shell Linux
Frida使用文档(一)安装、启动、运行、关闭
Frida使用文档(一)安装、启动、运行、关闭
|
Windows
windows卸载程序提示“请等待当前程序完成卸载或更改“问题解决方法,windows卸载卡进程问题解决方法
windows卸载程序提示“请等待当前程序完成卸载或更改“问题解决方法,windows卸载卡进程问题解决方法
287 0
windows卸载程序提示“请等待当前程序完成卸载或更改“问题解决方法,windows卸载卡进程问题解决方法
|
Windows
在 win10 环境下,设置自己写的 程序 开机自动 启动的方法
原文:在 win10 环境下,设置自己写的 程序 开机自动 启动的方法 1、是登录自己用户时才能开机启 C:\Users\username\AppData\Roaming\Microsoft\Windows...
1145 0
|
Web App开发 MySQL 关系型数据库
window10环境下的MySQL安装和完全卸载
前言: 今天算是被MySQL给打败了。折腾了一下午加一晚上,费劲的很。官方文档也是很粗略的,没有具体的安装教程,也许是我没找到…… MySQL安装有两个方法: 1. MSI图形化界面安装 2. ZIP安装包下载。
3246 0
|
SQL Java 关系型数据库
|
Windows
Win10自带应用不喜欢?一条命令全部卸载
与Win8/Win8.1一样,Win10中继续内置了应用商店,所不同的是Windows10中已升级为通用应用商店,具有跨平台特性。可能有的朋友仍不喜欢使用Modern应用,因为传统桌面应用几乎能够满足人们的所有需求,而且Windows应用商店应用质量也还有待提升。
1178 0