C#版Windows服务安装卸载小工具-附源码

前言

在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实现安装或卸载。

开发思路

1、由于系统的权限限制,在运行程序时需要以管理员身份运行

2、因为需要实现安装和卸载两个功能,在程序运行时提示本次操作是安装还是卸载  需要输入 1 或 2

3、接下来程序会查找当前目录中的可执行文件并过滤程序本身和有时我们复制进来的带有vhost的文件,并列出列表让操作者选择(一般情况下只有一个)

4、根据用户所选进行安装或卸载操作

5、由于可能重复操作,需要递归调用一下

具体实现

首先们要操作服务,需要用  System.ServiceProcess 来封装实现类

 

  1 using System;
  2 using System.Collections;
  3 using System.Configuration.Install;
  4 using System.Linq;
  5 using System.ServiceProcess;
  6
  7 namespace AutoInstallUtil
  8 {
  9     public class SystemServices
 10     {
 11         /// <summary>
 12         /// 打开系统服务
 13         /// </summary>
 14         /// <param name="serviceName">系统服务名称</param>
 15         /// <returns></returns>
 16         public static bool SystemServiceOpen(string serviceName)
 17         {
 18             try
 19             {
 20                 using (var control = new ServiceController(serviceName))
 21                 {
 22                     if (control.Status != ServiceControllerStatus.Running)
 23                     {
 24                         control.Start();
 25                     }
 26                 }
 27                 return true;
 28             }
 29             catch
 30             {
 31                 return false;
 32             }
 33         }
 34
 35
 36         /// <summary>
 37         /// 关闭系统服务
 38         /// </summary>
 39         /// <param name="serviceName">系统服务名称</param>
 40         /// <returns></returns>
 41         public static bool SystemServiceClose(string serviceName)
 42         {
 43             try
 44             {
 45                 using (var control = new ServiceController(serviceName))
 46                 {
 47
 48                     if (control.Status == ServiceControllerStatus.Running)
 49                     {
 50                         control.Stop();
 51                     }
 52                 }
 53                 return true;
 54             }
 55             catch
 56             {
 57                 return false;
 58             }
 59         }
 60
 61         /// <summary>
 62         /// 重启系统服务
 63         /// </summary>
 64         /// <param name="serviceName">系统服务名称</param>
 65         /// <returns></returns>
 66         public static bool SystemServiceReStart(string serviceName)
 67         {
 68             try
 69             {
 70                 using (var control = new ServiceController(serviceName))
 71                 {
 72                     if (control.Status == System.ServiceProcess.ServiceControllerStatus.Running)
 73                     {
 74                         control.Continue();
 75                     }
 76                 }
 77                 return true;
 78             }
 79             catch
 80             {
 81                 return false;
 82             }
 83         }
 84
 85         /// <summary>
 86         /// 返回服务状态
 87         /// </summary>
 88         /// <param name="serviceName">系统服务名称</param>
 89         /// <returns>1:服务未运行  2:服务正在启动  3:服务正在停止  4:服务正在运行  5:服务即将继续  6:服务即将暂停  7:服务已暂停  0:未知状态</returns>
 90         public static int GetSystemServiceStatus(string serviceName)
 91         {
 92             try
 93             {
 94                 using (var control = new ServiceController(serviceName))
 95                 {
 96                     return (int)control.Status;
 97                 }
 98             }
 99             catch
100             {
101                 return 0;
102             }
103         }
104
105         /// <summary>
106         /// 返回服务状态
107         /// </summary>
108         /// <param name="serviceName">系统服务名称</param>
109         /// <returns>1:服务未运行  2:服务正在启动  3:服务正在停止  4:服务正在运行  5:服务即将继续  6:服务即将暂停  7:服务已暂停  0:未知状态</returns>
110         public static string GetSystemServiceStatusString(string serviceName)
111         {
112             try
113             {
114                 using (var control = new ServiceController(serviceName))
115                 {
116                     var status = string.Empty;
117                     switch ((int)control.Status)
118                     {
119                         case 1:
120                             status = "服务未运行";
121                             break;
122                         case 2:
123                             status = "服务正在启动";
124                             break;
125                         case 3:
126                             status = "服务正在停止";
127                             break;
128                         case 4:
129                             status = "服务正在运行";
130                             break;
131                         case 5:
132                             status = "服务即将继续";
133                             break;
134                         case 6:
135                             status = "服务即将暂停";
136                             break;
137                         case 7:
138                             status = "服务已暂停";
139                             break;
140                         case 0:
141                             status = "未知状态";
142                             break;
143                     }
144                     return status;
145                 }
146             }
147             catch
148             {
149                 return "未知状态";
150             }
151         }
152
153         /// <summary>
154         /// 安装服务
155         /// </summary>
156         /// <param name="stateSaver"></param>
157         /// <param name="filepath"></param>
158         public static void InstallService(IDictionary stateSaver, string filepath)
159         {
160             try
161             {
162                 var myAssemblyInstaller = new AssemblyInstaller
163                 {
164                     UseNewContext = true,
165                     Path = filepath
166                 };
167                 myAssemblyInstaller.Install(stateSaver);
168                 myAssemblyInstaller.Commit(stateSaver);
169                 myAssemblyInstaller.Dispose();
170             }
171             catch (Exception ex)
172             {
173                 throw new Exception("installServiceError/n" + ex.Message);
174             }
175         }
176
177         public static bool ServiceIsExisted(string serviceName)
178         {
179             ServiceController[] services = ServiceController.GetServices();
180             return services.Any(s => s.ServiceName == serviceName);
181         }
182
183         /// <summary>
184         /// 卸载服务
185         /// </summary>
186         /// <param name="filepath">路径和文件名</param>
187         public static void UnInstallService(string filepath)
188         {
189             try
190             {
191                 //UnInstall Service
192                 var myAssemblyInstaller = new AssemblyInstaller
193                 {
194                     UseNewContext = true,
195                     Path = filepath
196                 };
197                 myAssemblyInstaller.Uninstall(null);
198                 myAssemblyInstaller.Dispose();
199             }
200             catch (Exception ex)
201             {
202                 throw new Exception("unInstallServiceError/n" + ex.Message);
203             }
204         }
205     }
206 }

接下来我们封装控制台的操作方法为了实现循环监听这里用了递归

 1 using System;
 2 using System.Diagnostics;
 3 using System.IO;
 4 using System.Linq;
 5
 6 namespace AutoInstallUtil
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             try
13             {
14                 ServerAction();
15             }
16             catch (Exception ex)
17             {
18                 Console.WriteLine("发生错误:{0}", ex.Message);
19             }
20
21             Console.ReadKey();
22         }
23
24         /// <summary>
25         /// 操作
26         /// </summary>
27         private static void ServerAction()
28         {
29             Console.WriteLine("请输入:1安装  2卸载");
30             var condition = Console.ReadLine();
31             var currentPath = Environment.CurrentDirectory;
32             var currentFileNameVshost = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName).ToLower();
33             var currentFileName = currentFileNameVshost.Replace(".vshost.exe", ".exe");
34             var files =
35                 Directory.GetFiles(currentPath)
36                     .Select(o => Path.GetFileName(o).ToLower())
37                     .ToList()
38                     .Where(
39                         o =>
40                             o != currentFileNameVshost
41                             && o != currentFileName
42                             && o.ToLower().EndsWith(".exe")
43                             && o != "installutil.exe"
44                             && !o.ToLower().EndsWith(".vshost.exe"))
45                     .ToList();
46             if (files.Count == 0)
47             {
48                 Console.WriteLine("未找到可执行文件,请确认当前目录有需要安装的服务程序");
49             }
50             else
51             {
52                 Console.WriteLine("找到目录有如下可执行文件,请选择需要安装或卸载的文件序号:");
53             }
54             int i = 0;
55             foreach (var file in files)
56             {
57                 Console.WriteLine("序号:{0}  文件名:{1}", i, file);
58                 i++;
59             }
60             var serviceFileIndex = Console.ReadLine();
61             var servicePathName = currentPath + "\\" + files[Convert.ToInt32(serviceFileIndex)];
62             if (condition == "1")
63             {
64                 SystemServices.InstallService(null, servicePathName);
65             }
66             else
67             {
68                 SystemServices.UnInstallService(servicePathName);
69             }
70             Console.WriteLine("**********本次操作完毕**********");
71             ServerAction();
72         }
73     }
74 }

到此为止简单的安装程序就写完了,为了醒目我选了个红色的西红柿来做为图标,这样显示些

源码和程序

http://pan.baidu.com/s/1qWqXG4W    提取码:piq4

 

时间: 2024-09-20 14:09:46

C#版Windows服务安装卸载小工具-附源码的相关文章

大炮打敌机小游戏(附源码)

动画效果: 点击这里下载源文件 主场景中ball的帧内容: 主场景中AS: gun_mc._rotation=-40; _root.ang=-40; _root.total=0; _root.attachMovie("fly","fly",10,{_x:random(300)+220,_y:random(220)+10}); up_btn.onPress=function(){ turnangle(5); if(gun_mc._rotation<-85){ g

c# windows 服务安装的“提交“阶段出现异常,求大神们帮下忙

问题描述 c# windows 服务安装的"提交"阶段出现异常,求大神们帮下忙 正在开始安装的"安装"阶段. 查看日志文件的内容以获得 D:DocumentsVisual Studio 2013ProjectsTimerTimerob jDebugTimer.exe 程序集的进度. 该文件位于 D:DocumentsVisual Studio 2013ProjectsTimerTimerobjDebugTimer. installLog. 正在安装程序集"

WEBJX收集分享6款实用jQuery小插件及源码

文章简介:jQuery是一款最流行的JS开源框架,凭借其小巧实用占领了很大的开发市场,jQuery另外一个优势就是拥有丰富多彩的插件,这些插件可以帮助你简化很多的开发过程.下面介绍的6款实用jQuery小插件及源码,希望大家喜欢. jQuery是一款最流行的JS开源框架,凭借其小巧实用占领了很大的开发市场,jQuery另外一个优势就是拥有丰富多彩的插件,这些插件可以帮助你简化很多的开发过程.下面介绍的6款实用jQuery小插件及源码,希望大家喜欢. 1.jQuery智能单词提示工具 这是一款可以

ubuntu-Ubuntu14.04怎么安装repo以及下载Android源码(如何翻墙)

问题描述 Ubuntu14.04怎么安装repo以及下载Android源码(如何翻墙) 最近在看老罗的Android源码情景分析一书,想要下载Android源码来研究,可是安装repo时,网络总是连接失败,我在网上找的hosts文件在windows下正常访问google,可是贴到Ubuntu就访问不了,请各位高人指条明路,我该如何下载repo,以及如何利用repo下载Android源码?买VPN的话可靠吗?是否有推荐? 解决方案 参考 android source code from githu

yum工具 源代码-yum工具的源码在哪里可以找到?

问题描述 yum工具的源码在哪里可以找到? 想对Linux下yum软件更新工具进行修改,请问其源代码可以在哪里得到?

各位大神,急需微信小视频Android源码

问题描述 各位大神,急需微信小视频Android源码 目前在做一个社交聊天的软件,其中有部分功能涉及到微信里的小视频功能,在网上没有查到相关的资料,想求各位大神们分享一下小视频的源码,金币木有啦,祝您和家人们新年快乐,万事如意! 解决方案 试试vitamio? 解决方案二: vitamio出了一个方视频recorder的demo 应该最满足你的需求的 解决方案三: http://download.csdn.net/detail/myactivity/9149695 我做的一个小demo,希望能够

php 斗牛-有没有网页版的斗牛,用php写的源码,或者教下要怎么写

问题描述 有没有网页版的斗牛,用php写的源码,或者教下要怎么写 有没有网页版的斗牛,用php写的源码,或者教下要怎么写? 求大神帮忙,有没有什么资源

小程序:酒店商城小程序实战案例开发、小程序项目源码弹窗特效

利用最近的空档时间,整理了下前段时间开发的酒店商城小程序项目案例.  该商城小程序项目源码100%纯手写代码,结构简单易懂.易于学习,开发中用到了一些微信组件 如: swiper.scroll-view.navigator.....,并且运用动画函数自写了一个底部动画弹窗特效(弹窗内容自定),小程序城市定位选择switchCity进行了代码优化,滑动点击右侧字母可定位到相应城市. https://shop156783577.taobao.com/             -->>> QQ

微信 小程序前端源码详解及实例分析_其它综合

微信小程序前端源码逻辑和工作流 看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.js,app(obj)注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.其他文件可以通过全局方法getApp()获取app实例,进而直接调用它的属性或方法,例如(getApp().globalData) //app.js App({ onLau