windows服务部署与卸载

同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试、部署、卸载。

一、创建windows service

1. 打开VS2008,新建一个Project, Project类型选择Visual C#-Windows,在Templates中选择Windows Service, 其他可以默认,点击OK。

2. 在Solution Explorer中会看到自动产生了三个文件:app.config, Program.cs,Service1.cs,其中app.config可以添加一些自定义的配置信息,供代码文件使用;Program.cs提供了Main()方法,作为程序的人口,一般不需要修改;Service1.cs就是要实现的服务。

3. 双击打开Service1.cs,会默认打开Service1.cs[Design],在这个界面可以拖拽一个组件,此外,在Properties中,会看到一些关于这个service的属性设置,比如AutoLog(True:使用windows event log记录该service的日志;False:用户可以自定义自己的event Log),CanPauseAndContinue(True:可以处理暂停和继续该服务的操作;False:不可以处理暂停或者继续该服务的操作),ServiceName(用于让Service Control Manager识别的服务名称)。

4. 转到Code视图,可以看到默认生成了一个构造函数,和两个需要重写的方法OnStart和OnStop,我们需要覆写这两个方法。下面是简单重写了OnStart方法。

   protected override void OnStart(string[] args)
   {
            string path = @"d:\share\test.txt";
            StreamWriter sw;
            sw = new StreamWriter(path);
            foreach (string arg in args) sw.WriteLine(arg);
            sw.Close();
            sw.Dispose();
   } 这样最基本的一个windows service就搞定了,但是能否正常运行,我们需要调试一把。

二、调试windows service

通常,我们用的调试方法是需要把服务部署好,然后attach to process...,找到对应的服务进程,予以调试。但是操作比较繁琐,修改完服务后,需要卸载服务,然后重新部署,并且OnStart方法难以调试。从网络上找到一个好的调试方法,并尝试通过,很好用的,推荐给大家:)

1. 在Service1.cs中添加public方法,将需要调试的protected方法进行封装,供Main()调用,以调试OnStart()为例:

  public void start(string[] args)   {
            this.OnStart(args);
  }

2. 在Main()中添加下面的代码,在人机交互时执行:

     if (Environment.UserInteractive)
            {
                Service1 s = new Service1();
                string[] args = { "a", "b" };
                s.start(args);
                Console.WriteLine("the service is started");
                Console.ReadLine();
                s.stop();
                Console.WriteLine("the service is stopped");
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
         { 
          new Service1() 
         };
                ServiceBase.Run(ServicesToRun);
            }

3. 更改Project的输出类型

右击该Project,点击Properties,在Application标签中,更改Output Type为Console Application。

好了,这样就可以按F5调试了:)

三、部署

1. 在Service1.cs的design视图中,右击鼠标,点击Add Installer,会自动创建一个ProjectInstall.cs文件,在design视图中,有两个组件serviceProcessInstaller1:这个组件的属性有一个叫Accout,默认是User,这样在部署的时候需要输入用户名和密码,这里我们可以选择权限最小的Localservice,当然要获得更多的权限可以设置其它两个network service和local

serviceInstaller1:与服务本身相关的信息,比如服务名,服务描述,显示名称,启动类型等。

2. 如果使用系统默认的event log,那么现在就可以编译然后部署了;如果使用了自定义的event log,则需要在ProjectInstaller中修改部分代码。

3. 使用installutil.exe部署windows service

(注意权限,这里需要用Administrator用户去部署,否则会提示一些错误信息:比如An exception occurred during the Install phase.
System.Security.SecurityException: The source was not found, but some or all eve
nt logs could not be searched.  Inaccessible logs: Security. 或者 access is denied)

runas /user:Administrator cmd

cd C:\Windows\Microsoft.NET\Framework\v2.0.50727

installutil D:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe

到此就部署完成了。

四、卸载服务

installutil /uD:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe

五、启动服务

1. 在启动服务时,有时候会出现服务启动后又停止的错误提示信息,指出该服务可能没有被使用,我们可以查看eventvwr,里面会给出足够的错误信息,根据错误信息调整service代码就可以了,也有可能是因为服务要操作文件,没有权限的原因,这时候把要操作的文件权限放开就可以了。

2. 启动服务的时候,由于权限问题启动失败,我们可以设置启动的账号。

3. windows service的参数是在启动时一次传递的,可以以界面形式传入参数,也可以通过命令行的形式:sc start service1 arg0 arg1 ...

windows服务部署与卸载,布布扣,bubuko.com

时间: 2024-12-24 11:15:28

windows服务部署与卸载的相关文章

windows服务安装及卸载

1)安装脚本Install.bat%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe JobSchedule.exeNet Start ServiceOAsc config ServiceOA start= auto 2)卸载脚本Uninstall.bat%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u JobSchedule.exe w

JavaService以Windows服务部署jar包

在生产环境,可执行jar包如果仅以 java -jar的方式运行,多个后台服务进程名称区分不清,且重启等无法自动控制: 所以使用java service,将jar包以windows服务的方式部署在服务器中. JavaService.exe -install aaaService "%JAVA_HOME%\jre\bin\server\jvm.dll" -Djava.class.path="G:\lrh\code\goodsMonitor\export\GoodsMonitor

windows 服务 安装、卸载

1.新建项目 选中windows服务 2.添加安装程序 3.修改安装代码 ServiceProcessInstaller processInstall; ServiceInstaller serviceInstall; public ProjectInstaller() { this.processInstall = new ServiceProcessInstaller(); this.serviceInstall = new ServiceInstaller(); processInstal

windows服务部署

1.新建windows服务项目 2.编辑业务代码 我这里只写2句记录文本的测试代码 using System; using System.IO; using System.ServiceProcess; namespace WindowsService { public partial class Service : ServiceBase { public Service() { InitializeComponent(); } protected override void OnStart(

.NET Core Generic Host Windows服务部署使用Topshelf

此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只能关注一下官方issue #809 等他们方解决了. 官方文档只提供了一个<在 Windows 服务中托管 ASP.NET Core>的方案,可以使用Microsoft.AspNetCore.Hosting.WindowsServices类库来把Web应用部署为Windows服务.但是ASP.NET Core虽然是控制台程序

C# Windows服务创建安装卸载

一.创建Windows服务 使用VS创建一个新的windows服务应用程序 创建完成之后 二.相关配置 修改Service1名称为StartService(可以不改,自行选择) 添加安装程序并修改配置 安装完成之后,源码中会出现一个ProjectInstaller程序集,双击进入页面修改相关属性                    添加文件夹和实体类 LogHelper.cs 1 using System; 2 using System.Collections.Generic; 3 using

通过批处理进行Windows服务的安装/卸载&amp;启动/停止

安装服务 1 @echo off 2 3 set checked=2 4 set PATHS=%~sdp0 5 6 echo 按任意键执行安装--? 7 pause>nul 8 if %checked% EQU 2 ( 9 %PATHS%InstallUtil.exe %PATHS%WindowsService1.exe 2>&1 10 )else echo 未安装NET Framework 14 pause>nul 卸载服务 1 @echo off 2 3 set checke

【JavaService】使用Java编写部署windows服务

如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Service类可以编写windows服务,对于一个Java开发人员来说,想要编写一个windows服务部署到服务器里面, 还要在自己的开发环境装一个visio studio,那太麻烦了. 那么问题来了,我想用java编写一个windows服务,这个想法可行吗?答案是肯定的,可行! 开源的JavaService

ASP.NET Core使用TopShelf部署Windows服务

asp.net core很大的方便了跨平台的开发者,linux的开发者可以使用apache和nginx来做反向代理,windows上可以用IIS进行反向代理. 反向代理可以提供很多特性,固然很好.但是还有复杂性,我们也可以使用windows service来直接启动kestrel. asp.net core官方网站提供了一种基于windows服务部署的方法:在 Windows 服务中托管 ASP.NET Core 这种方式需要修改代码,然后部署的时候,使用命令行创建.安装服务,然后再启动. 感觉