Windows服务代码控制安装卸载、启动停止
来源:互联网 发布:数据分析师专业 编辑:程序博客网 时间:2024/05/16 20:30
前文书提到Windows服务控制相关方法很多,命令行、代码都可,这里写点我自己比较常用的方法之一
话不多说,开始创建傻瓜式服务程序
1.首先是创建一个Windows服务项目,打开VS创建项目,选择 “Windows服务”
2.创建出的项目默认是服务文件名为 Service1.cs,我习惯在这里改一下名,例如“MyService”.
双击MyService.cs会出现如下界面,先添加安装程序。工作区右键选择“添加安装程序”
3.安装服务添加后默认文件名为ProjectInstaller.cs,无需修改。同时安装程序工作区会多出两个组件
在组件上右键选择“属性”
4.serviceProcessInstaller1属性如下
其中比较重要的是Account属性,其取值有
- LocalService(本地服务用户)
充当本地计算机上非特权用户的帐户,该帐户将匿名凭据提供给所有远程服务器。
- NetworkService(网络用户)
提供广泛的本地特权的帐户,该帐户将计算机的凭据提供给所有远程服务器。
- LocalSystem(本地系统用户)
服务控制管理员使用的帐户,它具有本地计算机上的许多权限并作为网络上的计算机。
- User(指定用户)
由网络上特定的用户定义的帐户。 如果为 成员指定 User,则会使系统在安装服务时提示输入有效的用户名和密码,除非您为 ServiceProcessInstaller 实例的 和 这两个属性设置值。
如果要使用UNC,则必须使用NetworkService或User;
LocalSystem权限比较大,本地服务使用这个可以避免不少问题,当然指定User也是不错的选择
5.serviceInstaller1属性中比较重要的是ServiceName,这个即服务名称
启动、停止我们暂不关心,打开Program.cs
默认会给出一个Main()函数,不带参数,这里准备用参数来控制服务,因此给main加上参数
static void Main(string[] args)这里需要注意,用户调用的程序进入的是用户交互模式,系统调用则是非用户交互模式(叫什么我也不知道。。。)
判断是否是用户交互模式用 Environment.UserInteractive,加上参数判断,我们的main函数编程如下所示:
static void Main(string[] args){if (Environment.UserInteractive){string param = string.Concat(args);switch (param){case "--install":break;case "--uninstall":break;case "--start":break;case "--stop":break;default:break;}} else{ServiceBase[] ServicesToRun;ServicesToRun = new ServiceBase[]{new MyService()};ServiceBase.Run(ServicesToRun);}}
这里用ManagedInstallerClass.InstallHelper来安装、卸载服务
ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });//安装服务ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });//卸载服务
需要添加命名空间
using System.Configuration.Install;using System.Reflection;将其添加到switch..case...中
case "--install":ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });//安装服务break;case "--uninstall":ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });//卸载服务break;
启动和停止服务这里用ServiceController
/// <summary>/// 启动服务/// </summary>/// <param name="srv_name">服务名称</param>/// <param name="time_out">启动超时,默认30秒</param>/// <returns>成功:true,失败:false</returns>public static bool StartService(string srv_name, int time_out = 30000){ServiceController service = new ServiceController(srv_name);try{TimeSpan timeout = TimeSpan.FromMilliseconds(time_out);service.Start();service.WaitForStatus(ServiceControllerStatus.Running, timeout);return true;}catch (Exception ex){System.Diagnostics.Debug.WriteLine(ex.ToString());return false;}}/// <summary>/// 停止服务/// </summary>/// <param name="srv_name">服务名称</param>/// <param name="time_out">停止超时,默认30秒</param>/// <returns>成功:true,失败:false</returns>public static bool StopService(string srv_name, int time_out = 30000){ServiceController service = new ServiceController(srv_name);try{TimeSpan timeout = TimeSpan.FromMilliseconds(time_out);service.Stop();service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);return true;}catch (Exception ex){System.Diagnostics.Debug.WriteLine(ex.ToString());return false;}}添加到switch...case...中
case "--start":StartService("MyService");break;case "--stop":StopService("MyService");break;
这样服务程序就完成了,至于服务的实现,这里就不多说了,以后有时间再说。
编译测试一下。
MyService --install
正在安装服务 MyService...已成功安装服务 MyService。正在日志 Application 中创建 EventLog 源 MyService...“安装”阶段已成功完成,正在开始“提交”阶段。查看日志文件的内容以获得 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe 程序集的进度。该文件位于 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog。正在提交程序集“F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe”。受影响的参数是: logtoconsole = logfile = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog assemblypath = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe“提交”阶段已成功完成。已完成事务处理安装。
MyService --start
MyService --stop
MyService --uninstall
正在开始卸载。查看日志文件的内容以获得 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe 程序集的进度。该文件位于 F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog。正在卸载程序集“F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe”。受影响的参数是: logtoconsole = logfile = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.InstallLog assemblypath = F:\Project\MyProjects\C_Shape\MyService\MyService\bin\Debug\MyService.exe“MyService.vshost.exe”(CLR v4.0.30319: MyService.vshost.exe): 已加载“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\SMDiagnostics\v4.0_4.0.0.0__b77a5c561934e089\SMDiagnostics.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。“MyService.vshost.exe”(CLR v4.0.30319: MyService.vshost.exe): 已加载“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.ServiceModel.Internals\v4.0_4.0.0.0__31bf3856ad364e35\System.ServiceModel.Internals.dll”。已跳过加载符号。模块进行了优化,并且调试器选项“仅我的代码”已启用。“MyService.vshost.exe”(CLR v4.0.30319: MyService.vshost.exe): 已加载“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.ServiceProcess.resources\v4.0_4.0.0.0_zh-Hans_b03f5f7f11d50a3a\System.ServiceProcess.resources.dll”。模块已生成,不包含符号。正在移除 EventLog 源 MyService。正在从系统中移除服务 MyService...已成功地从系统中移除服务 MyService。卸载完成。
- Windows服务代码控制安装卸载、启动停止
- windows服务(安装/启动/卸载/停止)批处理代码
- Windows非安装版Tomcat安装/卸载/启动/停止服务
- Windows服务代码实现安装、卸载、运行、停止
- C#对Windows服务操作(注册安装服务,卸载服务,启动停止服务,判断服务存在)
- 【Linux】服务安装、启动、停止和卸载
- 服务(安装 卸载 启动 停止)命令
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
- vs2005 以上开发windows 服务的安装,卸载启动,停止批处理
- 用代码启动和停止Windows服务
- 对NT服务型程序的控制代码。如安装服务、启动、停止服务、取服务状态等。
- XP下安装、启动、停止、卸载服务程序
- c# 服务程序安装卸载启动停止
- C#制作Windows service服务系列一:制作一个可安装、可启动、可停止、可卸载的Windows service
- LintCode(105) 复制带随机指针的链表
- 多线程和多进程的区别(小结)
- C/C++ 中缀表达式转换成后缀表达式并求值
- <%= %>、<% %>、<%@ %>、<%:%>和<%# %>的区别
- 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式
- Windows服务代码控制安装卸载、启动停止
- Android5.X和Android6.X上读写外置 USB设备的方案
- 动态规划1-数字三角形(算法基础 第4周)
- 【转】【复】实现复数中的运算符重载
- 科普:x64与IA64
- intellij的maven工程"Server IPC version 9 cannot communicate with client version"错误的解决办法
- Leetcode Max Points on a Line
- oop概念性讲解
- 在web.xml中配置diaplay-name是什么意思