您的位置:首页 > 编程语言 > C#

C#创建、设置和安装Windows服务

2016-11-17 16:34 155 查看
文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html;和:http://www.cnblogs.com/xujie/p/5695673.html;部分是我自己后来的一些理解添加进去的。

正文:在网上看了一些示例,大部分都言过其实,把过程搞得太过复杂,老是需要去研究如何利用InstallUtil.exe及其参数。事实上,既然要安装.net下制作的windows服务,肯定首先得在目标机器上安装有.net框架。因此,InstallUtil.exe也一定已经存在目标机器上了,因而利用微软的傻瓜式操作就能很好地解决windows服务安装和卸载的问题。

过一段时间估计还要狠狠地利用windows服务来完成一些功能,为了加深印象,又回过头弄了一个名叫HelloWorldService的windows服务,用最简单的demo来完成所有的操作。这个服务的功能,仅仅是在它启动的时候创建一个HelloWorld.txt文件,里边写上Hello World!这几个简单的字母而已。

1、新建windows服务项目,我这里选择的是Framework4.0,没有选择高版本是为了防止在服务在一些低版本系统上无法正常运行。





2、新建的Windows 服务项目如图右侧所示,双击Service1.cs,出现左侧Windows 服务的 设计界面,对左侧界面右击,点击 添加安装程序(用于添加Windows 服务的安装程序)。

这里貌似不需要修改Service1.cs设计界面的属性列表中的ServiceName值(该值默认是Service1),这个值会被添加的安装程序(ProjectInstaller.cs)中设计界面的serviceInstaller1的属性列表中的ServiceName的值覆盖/替代,故更改serviceInstaller1中的ServiceName值就可以了,该值就是sc delete XXX 的XXX的值。





3、添加安装程序后项目中会生成带有默认配置的ProjectInstaller.cs文件,如图右侧(看图标样子应该也是个服务文件,和Service1.cs对应),左侧是该文件(服务)的设计界面



4、新建完安装程序后,需要给ProjectInstaller.cs中默认的serviceInstaller1和serviceProcessInstaller1做一些基本的属性设置。如下图:

4.1、[b]serviceInstaller1的配置:[/b]

[b]图1:[/b]

[b]

[/b]

ServiceInstaller安装一个类,该类扩展 ServiceBase 来实现服务。在安装服务应用程序时由安装实用工具调用该类。在这里主要修改其StartType属性。此值指定了服务的启动模式。

Automatic 指示服务在系统启动时将由(或已由)操作系统启动。如果某个自动启动的服务依赖于某个手动启动的服务,则手动启动的服务也会在系统启动时自动启动。
Disabled 指示禁用该服务,以便它无法由用户或应用程序启动。
Manual 指示服务只由用户(使用“服务控制管理器”)或应用程序手动启动。

图2:



这里作下解释(解释以这里的为准,图片上的描述及名字的解释有些不准):上图中的Description是系统(Windows)服务中对应的服务的描述,而DisplayName该服务的名称,而ServiceName则是

Windows 任务管理器的服务页中的对应项的名称;这三个名字都可以用中文,但是ServiceName最好用英文(这个值就是 sc delete XXX的XXX对应的值)

4.2、serviceProcessInstaller1的配置:

图1:





ServiceProcessInstall安装一个可执行文件,该文件包含扩展 ServiceBase 的类。该类由安装实用工具(如 InstallUtil.exe)在安装服务应用程序时调用。在这里主要是修改其Account属性。

ServiceAccount指定服务的安全上下文,安全上下文定义其登录类型。

LocalService 充当本地计算机上非特权用户的帐户,该帐户将匿名凭据提供给所有远程服务器。
LocalSystem 服务控制管理员使用的帐户,它具有本地计算机上的许多权限并作为网络上的计算机。
NetworkService 提供广泛的本地特权的帐户,该帐户将计算机的凭据提供给所有远程服务器。
User 由网络上特定的用户定义的帐户。如果为 ServiceProcessInstaller.Account 成员指定 User,则会使系统在安装服务时提示输

入有效的用户名和密码,除非您为 ServiceProcessInstaller 实例的 Username 和 Password 这两个属性设置值。

图2:



这里也作下解释:设置Account为LocalSystem就相当于在启动该服务时是以管理员权限来启动的。如果上图的Account不设置为LocalSystem而是LocalService可能启动服务会出现以下错误:



想知道原因可以在系统的”事件查看器“中的”应用程序“选项中查看具体的错误信息,如下图:



上图的错误原因是是由于服务对文件系统的操作权限问题所引起的,将serviceProcessInstaller1中的Account由LocalService改成LocalSystem就行了。

5、以上工作完成,安装程序配置完毕,接下来添加应用程序配置文件(如果有需要的话,很多服务项目默认有一个App.config文件的一般是不需要添加),如图:





6、编写windows服务主代码:

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Diagnostics;
6 using System.Linq;
7 using System.ServiceProcess;
8 using System.Text;
9
10 using System.IO;
11
12 namespace OrganizClientSocketService
13 {
14     public partial class Service1 : ServiceBase
15     {
16         private MainService _mainServ;
17         public Service1()
18         {
19             InitializeComponent();
20         }
21
22          // 开启服务要执行的代码
23         protected override void OnStart(string[] args)
24         {
25             _mainServ = new MainService();
26             _mainServ.Start();  // 开启服务
27         }
28
29          // 停止服务要执行的代码
30         protected override void OnStop()
31         {
32             _mainServ.Stop();  // 停止服务
33             _mainServ = null;  // 释放服务资源
34         }
35     }
36 }


7、编译生成Windows 服务程序。

8、上面的Windows 服务项目编译生成的都是 安装包 最终要安装/卸载的对象;接下来就添加一个安装项目用来安装上面的服务,如图:




9、添加工程后,在默认的 视图界面(可通过右击安装项目->视图->文件系统; 打开此视图界面) 右键点击”应用程序文件夹“,选择”添加“->”项目输出“;(这部分也可以参照VS如何添加一个安装项目之类的文章)





在弹出的窗口中选择“主输出”(记得选中项目),点击“确定”。



注意:上面的选择里还有个配置可选,可选项有如图:

如果不选则默认是 (活动),它和需要打包的项目的状态是一致的,如果待打包的项目当前是Debug的,则(活动)代表 Debug Any CPU;

如果你的待打包项目的Release和Debug是不同的,则最好手动选中Debug还是Release(比如待打包项目的Debug是测试用的窗体程序,而Release则是真正要发布的Windows服务程序,这时候最好手动选择)



10、上面的步骤定义了最后在应用程序文件夹中包含的内容。下面来定义其他方面的内容[b](设置安装程序执行的同时安装服务到系统服务列表中,很重要)。[/b]

在项目上点右键,选择 视图->自定义操作:





出来如下的界面,然后在”自定义操作“上点右键,选择”添加自定义操作“:



在弹出的窗口中双击”应用程序文件夹“:



然后选择”主输出来自HelloWorldService(活动)“(这部分要根据自己的程序进行相应的更改),点击”确定“:



选择之后会发现所有的操作下边都添加了刚才选定的项,如下图。做到这一步,就能使安装程序卸载时不仅把程序卸载下来,也能把服务卸载下来(安装的同时真正意义上的安装服务)。



11、接下来在安装项目上点右键,选择”生成“,就能使安装程序正常发布了,成功后会生成两个文件(这里貌似只需要 .msi的文件就可以安装了setup.exe不知道有什么用)。





// 这句话可不看:安装成功后根据你的Windows 服务项目中服务安装程序的配置决定是否需要手动启动服务。

重要提示:如果想要windows服务安装后立刻主动启动可以在Windows Service的ProjectInstaller.cs(添加安装程序)中增加下面的代码:

///// <summary>
///// 修改Visual Studio 中 Windows Service的ProjectInstaller.cs中的代码
///// 重写安装完成后函数(只功能都已经安装完成,而不是安装窗体已经关闭)
///// 实现安装完成后自动启动已安装的程序或启动服务(可能需要管理员权限才有用),看下怎样才能让安装程序必须有管理员权限。(或许可以通过C#本身的代码实现开启服务,而不一定要管理员权限)
///// </summary>
//protected override void OnAfterInstall(IDictionary savedState)
//{
//    base.OnAfterInstall(savedState);
//    MessageBox.Show("是安装完成后才出现的吗?");  // 这个可以执行一个 .bat(net start XXX)来开启Windows服务,不过需要管理员权限;
//}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: