首页 > 代码库 > C# Windows服务开发和安装

C# Windows服务开发和安装

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


  • Windows服务管理器

在Windows系统中,你可以通过在命令行中输入services.msc回车,并可以打开本地的服务管理器。

wKioL1PkcyrxlKA_AAIg90FHCrE037.png

通过服务管理器,你可以对windows服务进行操作(停止,启动,重启,禁止运行)和查看服务的相关信息。

双击某个服务,可以看到服务的详细信息(包括General信息,如服务名称,状态,启动类型;授权信息;恢复机制;依赖关系等)

wKiom1PkdMuDak7cAACwsw6InA4402.png


  • 如何使用C#来开发Windows Service(以VS2010为例)

打开new project窗口,选择Windows Service,点击OK

wKiom1PkdvyDWpLUAAF4t9abbIg487.png

双击Service1.cs,你可以修改服务的相关属性

wKioL1Pke1GhvhogAAD8WjFiHxw670.png

AutoLog:决定是否把服务操作状态写到Event日志中去。

ServiceName:这个服务管理器中看到的名称


打开Service1的代码,添加你的业务代码

wKiom1PkeUSgoh82AATg9flq6Gc388.jpg

wKioL1PkekjhbG7bAADVnESLLpI445.png

Service1继承于System.ServiceProcess.ServiceBase类,你可以通过覆盖父类中虚方法来捕获服务的相关事件并做相应处理。

OnStart,OnStop,.....


InitializeComponent方法是用来初始化服务的基本属性,你也可以在这个方法里修改服务的属性。

       private void InitializeComponent()
        {
            //
            // Service1
            //
            this.CanShutdown = true;
            this.ServiceName = "Service1";
        }


System.ServiceProcess.ServiceBase中的属性和服务控制台中打开的服务属性的General tab相关。


为服务添加Installer

wKiom1Pkfw_T86BSAAD747TDMFU972.png

双击解决方案中新添加的ProjectInstaller.cs


你可以看到这个类中自动添加了两个变量serviceProcessInstaller1,serviceInstaller1


serviceProcessInstaller1的父类是System.ServiceProcess.ServiceProcessInstaller

它主要是用于安装一个继承System.ServiceProcess.ServiceBase的子类,当你使用InstallUtil.exe安装服务时,可以通过覆盖其中的虚方法来捕获安装时发生的事件并做相应处理。

wKioL1PkhJuD15--AAEMNG1DO4Y314.png


wKiom1Pkg4Lzi3pJAAD7mWXlWHU992.png

System.ServiceProcess.ServiceProcessInstaller中的属性和服务控制台中打开服务属性窗口的LogOn tab有关

Account:设置运行该服务使用的账号
Account    描述    备注
User    由网络上特定的用户定义的帐户。如果为 ServiceProcessInstaller.Account 成员指定 User,则会使系统在安装服务时提示输入有效的用户名和密码,除非您为 ServiceProcessInstaller 实例的 Username 和 Password 这两个属性设置值。     
LocalService    充当本地计算机上非特权用户的帐户,该帐户将匿名凭据提供给所有远程服务器。    
LocalSystem    服务控制管理员使用的帐户,它具有本地计算机上的许多权限并作为网络上的计算机。    
NetworkService    提供广泛的本地特权的帐户,该帐户将计算机的凭据提供给所有远程服务器。    

当初始化 ServiceProcessInstaller 以指定要安装的服务的安全上下文时,请使用 ServiceAccount 类。安全上下文指示服务在系统上的特权并指示服务在网络上如何操作(例如,服务是否将计算机的凭据或匿名凭据提供给远程服务器)。ServiceAccount 类提供一系列特权,以便您可以为任何特定的服务指定正好需要的特权。

LocalSystem 值定义具有高度特权的帐户,但大多数服务不需要这种提高的特权级别。LocalService 和 NetworkService 枚举成员为安全上下文提供较低的特权级别。

值 LocalService 和 NetworkService 仅适用于 Windows XP 和 Windows Server 2003 系列。



wKiom1PkjfKyAm1qAAEU_qs98Kc263.png


serviceInstaller1继承自System.ServiceProcess.ServiceInstaller

该类定义的属性和服务控制台打开服务属性窗口的General tab和Dependencies tab有关

其中ServiceName必须和System.ServiceProcess.ServiceBase的ServiceName保持一致。

Starttype:Manual,Automatic,Disabled


  • 安装Windows服务

    编译工程,把编译结果拷贝到某个目录


    以管理员的身份运行cmd,(如果不以管理员身份,你将无法成功安装服务,并提示下面错误信息

    System.Security.SecurityException: The source was not found, but some or all....)

  • wKiom1Pkk66iucQ9AAIh2JaLdeA416.jpg

    切换到编译结果目录,用InstallUtil安装服务

    wKiom1Pkk8iz08f2AAFlqlZT7Uw001.jpg


  • wKiom1Pkk_vxxlIeAAUyBsyeKZE319.jpg


如果日志中显示安装成功,查看服务控制台窗口,将能看到新建的服务Service1,你可以手动去启动它。

wKioL1PklaTCdP84AAQ_Wp0wyLk365.jpg