C# Windows 服务

Windows 服务是操作系统启动时可以自动打开的应用程序。Windows服务可以在没有交互式用户登录系统的情况下运行。可以把Windows 服务配置为从已进行特殊配置的用户账户或系统用户账户上运行。下面以VS2008为例,来看.net Windows 服务的简单使用。

一、创建Windows 服务

新建一个项目,Visual C# —> Windows –> Windows 服务,将项目名称改为WinServiceTest,修改项目的相应位置,如图1所示,

图1

单击确定后便会出现一个外表与Windows Forms 应用程序相似的设计器,但是不能在其中插入Windows Forms 组件,因为Windws 服务程序不能直接在屏幕上显示任何信息,见图2,

图2

打开服务的属性编辑窗口,可以配置服务的相关属性,见图3,

图3

使用服务属性可以设置以下值:

  • AutoLog指定启动服务和停止服务的事件自动写到日志文件中。
  • CanPauseAndContinue、CanShutdown和CanStop指定服务可以处理具体的暂停、继续、关闭和停止服务的请求。
  • ServiceName是写到注册表中的服务名称,使用这个名称可以控制服务。
  • CanHandlePowerEvent选项对运行在膝上计算机的服务有效。如果启用这个选项,服务就可以响应低电源事件,以改变服务的操作方式。

对任何属性的修改,都反应在.Designer.cs文件中InitializeComponent方法中,与Windows Forms 相似。应用程序的主函数在创建项目时生成的Program.cs文件中,在主函数中,声明了一个元素为ServiceBase类的数组ServicesToRun,如果这个服务进程中要运行多个服务,就需要把具体服务类的多个实例添加到数组中,然后把ServicesToRun数组传递给ServiceBase类的静态方法Run();如果进程中只有一个服务,就可以删除数组,Run()方法接收从ServiceBase派生出来的单个对象。

服务启动时会调用OnStart()方法,可以在OnStart()方法中添加处理程序,如设置时钟、启动线程等。服务停止时会调用OnStop()方法,可以在OnStop()方法中添加处理程序,如关闭时钟、停止线程等。如果设置了服务的相关属性,同样可以重写服务类中的OnPause()、OnContinue()、OnShutdown()、OnCustomCommand()方法,其中OnCustomCommand()处理程序可以为服务控制程序发送过来的定制命令提供服务。

二、Windows服务安装

要安装服务必须为服务添加安装程序类。切换到Visual Studio的设计视图,右键点击空白处,选择“添加安装程序,组件设计器将会创建一个新的ProjectInstall类、一个ServiceInstall实例和一个ServiceProcessInstaller实例。ServiceProcessInstaller类用于配置进程,为这个进程中所有服务定义属性值(记住,一个服务进程可以包含多个服务),这些共享的属性见下表:


属性


描述

  UserName,Password     Accout属性设置为ServiceAccout.User,则UserName属性和Password属性指出服务是在哪一个账户下运行
  Account     使用这个属性,可以指定服务的账户类型
  HelpText     HelpText属性是只读属性,它返回的文体用于帮助设置用户名和密码

表1

ServiceProcessInstaller类的Account属性值可以是ServiceAcount枚举的任一值,见表2



意义

  LocalSystem     设置这个值可以指定服务在本地系统上使用高度权限的用户账户,但这个账户允许匿名用户进入网络,因此它没有网络上的权限
  LocalService     这个账户类型给任意远程服务器提供计算机证书
  NetworkService     类似于LocalService,这个值指定把计算机的证书传送给远程服务器,但与LocalSystem不同,这种服务可以以非授权用户的身份     登录本地系统。顾名思义,这个账户只能用于需要从网络上获得资源的服务
  User     把Account属性设置为ServiceAccount.User,表示可以指定应在服务中使用的账户

表2

ServiceInstaller 每一个服务都需要的类,这个类的属性可以用于进程中的第一个服务,其属性有StartType、DisplayName、ServiceName和ServicesDependedOn,如表3中所示。


属性


说明

  StartType     StartType指出服务是手动启动还是自动启动。它的值可以是:SeriveStartMode.Automatic、ServiceStartMode.Manual、     ServiceStartMode.Disabled。如果使用ServiecStartMode.Disabled,服务就不能启动。这个选项可用于不应在系统中启动的服     务。例如,如果没有得到需要的硬件控制器,就可以把该选项设置为Disable。
  DisplayName     DisplayName是显示给用户的服务的友好名称。此外,这个名称也用于控制和监视服务的管理工具。
  ServiceName     ServiceName为服务的名称。这个值必须与服务程序中ServiceBase类的ServiceName属性一致,这个名称与把ServiceInstaller     配置为需要的服务程序相关。
  ServiceDespendedOn     指定必须在服务启动之前启动的一个服务组。当服务启动时,所有相依存的的服务都自动启动,并且我们的服务也将启动。

把安装类添加到项目后,可以使用installutil.exe 实用程序安装和卸载服务,这个应用程序可以用于安装包含了Install类的所有程序集。安装与卸载服务的命令分别如下:

installutil WinServiceTest.exe

installutil /u WinServiceTest.exe

也可以使用Windows 自带的服务安装命令,如

sc start WinServiceTest.exe

sc delete WinServiceTest.exe

三、windows 服务安装包制作

虽然可以使用installutil和sc命令来安装服务,但为了更直观和方便,可以将服务打包成安装包,然后通过界面提示进行安装。其步骤如下:

1. 添加安装与部署项目

图4

2. 向安装项目添加WinServiceTest.exe

在解决方案资源管理器中,右击“MyServiceSetup”,指向“添加”,然后选择“项目输出”,出现“添加项目输出组”对话框。在“项目”框中选择“WinServiceTest”,在列表框中,选择“主输出”,然后单击“确定”,WinServiceTest的主输出的项目项被添加到安装项目中,见图5。

图5

3. 向安装项目添加自定义操作

在解决方案资源管理器中右击安装项目,指向“视图”,然后选择“自定义操作”,出现自定义操作编辑器。

图6

在“自定义操作”编辑器中右击“自定义操作”节点,然后选择“添加自定义操作”,出现“选择项目中的项”对话框。

图7

在列表框中双击“应用程序文件夹”将其打开,选择“主输出来自WinServiceTest(活动)”,然后单击“确定”。

  图8

主输出被添加到自定义操作的所有四个节点,即“安装”、“提交”、“回滚”和“卸载”。

图9

4. 生成安装项目

在解决方案资源管理器中,右击WinServiceTest项目并选择“生成”。若要安装服务,右击解决方案资源管理器中的安装项目,并选择“安装”,按界面提示完成安装。

时间: 2024-10-10 13:08:06

C# Windows 服务的相关文章

C# 远程服务器 安装、卸载 Windows 服务,读取远程注册表,关闭杀掉远程进程

这里安装windows服务我们用sc命令,这里需要远程服务器IP,服务名称.显示名称.描述以及执行文件,安装后需要验证服务是否安装成功,验证方法可以直接调用ServiceController来查询服务,也可以通过远程注册表来查找服务的执行文件:那么卸载文件我们也就用SC命令了,卸载后需要检测是否卸载成功,修改显示名称和描述也用sc命令.至于停止和启动Windows服务我们可以用sc命令也可以用ServiceController的API,当停止失败的时候我们会强制杀掉远程进程,在卸载windows

(转)为C# Windows服务添加安装程序

本文转载自:http://kamiff.iteye.com/blog/507129 最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈 哈,扯远了,今天讲一下那个怎么给Windows服务做个安装包.为什么做安装包?当然是方便了,不用每次调用InstallUtil,还有,就是看上去 正规些. 不多说了,先来看看怎么做吧.首先,当然是创建一个Windows服务的项目.这个大家应该都知道怎么做(这都不明白的留

c# windows 服务学习

用C#做windows服务变得简单对了===按照下面步骤来就行了用C#创建Windows服务(Windows Services)例子服务功能:这个服务在启动和停止时,向一个文本文件中写入一些文字信息. 第一步:创建服务框架 要创建一个新的 Windows 服务,可以从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击 确定.你可以看到,向导向工程文件中增加WebService1.cs类:其中各属性的含意是: Autolog 是

c#创建windows服务

最近做了个windows端的小工具,监测指定文件夹的内容并将新增文件保存到数据库,一开始利用的是windows自带的计划任务去做,现在想改成windows服务. 然后找了篇文章照着弄了下: http://www.cnblogs.com/knowledgesea/p/3616127.html 碰到以下问题: 1.安装服务时提示设置服务登录,需要输入用户名和密码 serviceProcessInstaller类的Account属性默认是User,改为LocalSystem,就不需要输入了. 几种账户

Windows 服务

一. Windows服务的简介 [摘自百度百科]Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 二. Windows 服务实现 1. 创

topshelf包装redis为windows服务

topshelf包装redis为windows服务 Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Windows Service,利用windows installer实现的.如果使用topshelf,岂不是可以兼容mono,于是自己动手写了,实现很简单,代码已发布到github上 redis-topshelf. 如何使用? 1.打卡配置文件,配置文件描述如下: redis.service.name

利用Python脚本管理Windows服务

Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32serviceutil模块,此模块来自pywin32包,此模块本身有管理服务的功能,有兴趣的可以去阅读它的部分源码. 本脚本存在的目的是为了熟练Python的语法和基本操作,Windows下有更好的命令行工具来管理服务,如sc.Powershell等.通常命令行工具的执行速度要比services.m

(25)c# windows服务

转自 http://www.cnblogs.com/knowledgesea/p/3616127.html Windows服务介绍 Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文

《C#高级编程》读书笔记(十九):Windows服务

1,Windows 服务 Windows 服务是可以在系统启动时自动打开的程序.如果需要在没有用户交互操作情况下运行程序,或者在权限比交互式用户更大的用户下运行程序,就可以创建 Windows 服务. 2,Windows 服务的体系架构 操作 Windows 服务需要3种程序: • 服务程序 • 服务控制程序 • 服务配置程序 服务程序本身用于提供需要的实际功能. 服务控制程序可以把控制请求发送给服务,如开始.停止.暂停和继续. 使用服务配置程序可以安装服务,也可以在以后改变服务的配置. 3,服

使用Topshelf快速搭建Windows服务

创建一个windows服务用于同步SqlServer数据到Elasticsearch 新建elasticsearch索引 PUT:http://localhost:9200/index_singer/ { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "singer_index": { "