Windows Services(NT)服务学习!基础篇完整篇!

来源:互联网 发布:java jar包下载地址 编辑:程序博客网 时间:2024/06/17 11:40

         本文主要记录什么是Windows Service,及其主要组成?并通过一个列子来创建一个Windows Services,同时,记录几个在查资料碰到的问题。

         Windows Services全文简称NT

          1,  什么是Windows Services

              NT主要应用于服务器,是长期运行的应用程序,他不需要用户界面和任何模拟的输出,因此不同于Web程序,需要跟用户进行交互,他是一个隐藏性的“英雄”,做一些长期的、定时性的工作。比如,我现在做的项目,每个月10号定时从数据库提取数据,进行计算,生成账单报表,比如,每隔1个小时,调用一个exe程序,来定时更新本地数据库等等。

NT,可以随系统启动而启动,可以不用理睬登陆用户是哪个,当然,在安装好之后,可以通过服务列表来进行启动、暂停、!

说白啦,NT跟我们Web程序,都是应用程序,都是完成某一件事情而存在的,只不过一个隐藏,一个显示吧啦!

          2, Windows Services有哪些组成?

                   Windows Services服务在Visual Studio以前的版本叫NT服务,在VS.net启用呢新名称。

                  他主要由三部分组成,

                1,  一个服务可执行文件

                2,  一个服务控制程序(SCP)

                3,  一个服务控制管理器(SCM)

               其中服务控制管理器(SCM),主要跟注册表进行沟通,其在HKLM/SYSTEM/CurrentControlSet/Services下创建服务键值,用来告诉电脑该服务相关信息(包括调用路径等)。而用户可以通过服务控制程序(SCP)(我的理解在服务列表)对服务进行启动、停止、暂停等,其中服务控制程序(SCP)通过服务控制管理器(SCM)来调用服务进程。其实,我的理解是,就是系统、注册表、应用程序三者相互关联的理解!

              早期的版本,还需要我们自己编写程序来跟SCPSCM进行关联,但现在的VS已经帮我们封装好这些操作!我们只需要创建服务科执行文件就行啦!

             3, Windows Services例子?

                 现象开始创建NT服务应用程序!

                 开始vs2008—》文件》新建项目WindowsàWindows服务,OK,到这儿,Vs就帮我们创建好呢一个NT基本项目框架啦!

              

                说道这提到一点,NT是一个应用程序,应用程序,肯定会存在相关信息记录(错误记录、启动、停止等等),而NT是一个隐藏性的,因为我们一般会用到系统的事物日志(当然,你自己也可以写日志或者使用Log4Net)来记录这些消息。

                 这儿我们用到EventLog控件(就在Vs左边工具箱-组件里面),同时在拖一个Timer控件(注意,Timer是命名空间System.Timers.Timer里面的控件,别搞错啦-因为有2Timer),用来周期调用一个方法(该方法每隔30秒像一个记事本写入当前时间)

                 顺便提一下,服务主类(默认生成类名为Service1.cs)几个属性:

                 Autolog                是否自动写入系统的日志文件

                 CanHandlePowerEvent    服务时候接受电源事件

                CanPauseAndContinue         服务是否接受暂停或继续运行的请求

                CanShutdown服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown过程

                CanStop                             服务是否接受停止运行的请求

                ServiceName                      服务名

                了解一下就可以啦,就采用默认的就行啦。当然,你可以依据自己需要更改服务名!

                 之后就对Service1.cs,右键查看代码!

               其有几个主要方法OnStart、OnStop、OnContinue、OnPause,看单词就知道什么意思啦!这儿,我们在每一个方法里面写一个事物日志记录!

protected override void OnStart(string[] args)        {            eventLog1.WriteEntry("In OnStart");        }         protected override void OnStop()        {            eventLog1.WriteEntry("In OnStop");        }         protected override void OnContinue()        {            eventLog1.WriteEntry("In Oncontinue");        }         protected override void OnPause()        {            eventLog1.WriteEntry("In OnPause");     }


 

                     这样在服务,启动、停止、继续、暂停后,我们就能看到输出的事物日志啦!

                     在Service1构造函数里面,我们添加

if (!System.Diagnostics.EventLog.SourceExists("MyEventSource"))            {                System.Diagnostics.EventLog.CreateEventSource("MyEventSource", "MyEventLog");            }            eventLog1.Source = "MyEventSource";            eventLog1.Log = "MyEventLog";            timer_service.Interval = 30000; //30秒            timer_service.Enabled = true;


 

                      这些是创建事物日志,以及给定时器规定每30秒触发一次其本身的Elapsed事件!

                      双击定时器timer1的Elapsed事件!

                     我这边把生成当前日志记录的方法,单独放在一个类里面,通过类来掉用这个方法。大家也可以不用这样!

private void timer_service_Elapsed(object sender, System.Timers.ElapsedEventArgs e)        {            string path = @"E:\Debug\Record\Record.txt";            FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);            StreamWriter sw = new StreamWriter(fs);            sw.BaseStream.Seek(0, SeekOrigin.End);            sw.WriteLine("MyWindwosServices:    Service Info  " + DateTime.Now.ToString() + "\n");            sw.Flush();            sw.Close();            fs.Close();            //DataServiceHandler dsh = new DataServiceHandler();            //dsh.RecordInfo();        }


 

                   现在准备工作都已经完成,包括事物日志记录,以及每隔30秒调用一个方法!

                   现在开始安装程序!

                  在Service1.cs[设计]中,右键,点击“添加安装程序“,就会出现,一个文件,默认是ProjectInstaller.cs,他里面有2个组件,一个是安装程序(ServiceInstaller1)和服务关联进程的安装程序(ServiceProcessInstaller1)

                  顺便提一下,这2个组件主要相关属性,他们的作用通过名称就知道啦!

                 ServiceInstaller1中

                 ServiceName:进程中显示的名称和服务列表中显示的名称

                 StartType:

                 Manual      服务安装后,必须手动启动。

                 Automatic    每次计算机重新启动时,服务都会自动启动。

                 Disabled     服务无法启动。

                这里设置为 Automatic 。

                 ServiceProcessInstaller1中

                 Account:指定运行此服务的账号类型,我们选择为LocalSystem,表示无论哪个用户登录系统,都会起动服务!

 

               OK,这些都弄好后,在对项目进行生成!就可以部署啦!

              (可以单独把生成后的bin文件中Debug单独拷出来!这样路径简介并方便部署!)

 

 

             4,部署Windows Services服务!

                部署通过Visual Studio 2008命名提示,打开命名提示框(通过从开始-程序-Microsoft Visual Studio 2008-Visual Studio Tools)。

               其中installutil "E:\Debug\MyWindowsNTTwo.exe" 来进行安装!

               通过installutil /u "E:\Debug\MyWindowsNTTwo.exe" 来进行卸载!

               安装后,就可以通过服务列表来启动该服务啦!

               这是我自己安装卸载的命名提示图片!

               安装成功!

 

               卸载成功!

 

               OK!现在大家对Windows Services基本有一些了解呢吧!

 

 

              5,  记录一些问题和不惑的地方?

             1,在对windows Services生成后,目录底下会产生

             1.1, MyWindowsNTTwo.exe  目标服务文件

             1.2, MyWindowsNTTwo.InstallLog 日志安装文件记事本

             1.3, MyWindowsNTTwo.pdb    ?这个就搞不清楚,忘知道的同学能告知一声

             1.4, MyWindowsNTTwo.vshost.exe 这个是VS的宿主进程,用来提高调试性能

             1.5, MyWindowsNTTwo.vshost.exe.manifest ?这个也搞不清楚!

    

               2,服务与进程的区别?

                  进程是当前系统使用中调用的程序,包括一些dll动态连接库文件,而系统服务是系统当前使用的一些规则,服务的打开与否关系到系统能否执行某些特定的功能,简单的例子就是Terminal Service这个服务,这个是用于允许多位用户控制一台计算机的,也就是用于远程维护管理等操作的,我们平时在任务管理器中看到的用户名也是这个服务管理的,如果你禁用这个服务,那别人想控制你的电脑那是不行的,你在任务管理器中也无法查看到其他用户的进程了,而且服务之间是有可能互相依靠的。

              3,我对系统、注册表、应用程序之间关系的理解!

          一台电脑相当一个大的王国,一个程序(C)进入到该王国,国家给这个程序C分配一个地方,C开始扎根安装,安装的时候,你要通报给国家注册部门,要告诉你的来历,身份、如何找到你等信息,之后,就有一个图标,显示在国家的服务列表里面,外界人民想要这个服务,就点击这个图标,国家机构,就通过你已经在注册表注册的信息,找到你,或者提供相关信息给对方。这个就是注册表的作用!

 

本人能力有限,在文档中,可能会有一些错误,望大家斧正!

 

程序使用Vs2008,下载地址为:http://download.csdn.net/detail/zlhxiaohui/5574243

 参考呢:http://blog.csdn.net/yu_hong09/article/details/7741167

          http://www.cnblogs.com/caca/archive/2005/02/25/109028.html

        http://blog.163.com/huwei860711@126/blog/static/1998018220112475322999/

再次对他们表示感谢!

 

 

 

 

 

 

 

 

 

 

原创粉丝点击