注册windows服务



一般两种方法:

C:/WINDOWS/Microsoft.NET/Framework64/v2.0.50727/installutil yourproject.exe

D:/software/AllWays/PlanSrv.exe -install

D:/software/AllWays/PlanSrv.exe --install
 
.Net
dos命令下输入;
C:/Windows/Microsoft.Net/Framework/v2.0.to727>InstallUtil.exe E:/Test/WindowsServiec1.exe
删除:
C:/Windows/Microsoft.Net/Framework/v2.0.to727>InstallUtil.exe/u E:/Test/WindowsServiec1.exe

SC命令:
sc Create "name" binpath= "path"  displayname= "SVNService" depend= Tcpip start=auto

sc delete 服务名称

SC
描述:
        SC 是用于与服务控制管理器通信的命令行程序。
用法:
        sc <server> [command] [service name] <option1> <option2>...

        选项 <server> 的格式为 "[url=]//ServerName[/url]"
        可以键入 "sc [command]"以获得命令的进一步帮助
        命令:
          query-----------查询服务的状态,
                          或枚举服务类型的状态。
          queryex---------查询服务的扩展状态,
                          或枚举服务类型的状态。
          start-----------启动服务。
          pause-----------发送 PAUSE 控制请求到服务。
          interrogate-----发送 INTERROGATE 控制请求到服务。
          continue--------发送 CONTINUE 控制请求到服务。
          stop------------发送 STOP 请求到服务。
          config----------(永久地)更改服务的配置。
          description-----更改服务的描述。
          failure---------更改服务失败时所进行的操作。
          qc--------------查询服务的配置信息。
          qdescription----查询服务的描述。
          qfailure--------查询失败服务所进行的操作。
          delete----------(从注册表)删除服务。
          create----------创建服务(将其添加到注册表)。
          control---------发送控制到服务。
          sdshow----------显示服务的安全描述符。
          sdset-----------设置服务的安全描述符。
          GetDisplayName--获取服务的 DisplayName。
          GetKeyName------获取服务的 ServiceKeyName。
          EnumDepend------枚举服务的依存关系。
        下列命令不查询服务名称:
        sc <server> <command> <option>
          boot------------(ok | bad) 表明是否将上一次启动保存为
                          最后所知的好的启动配置
          Lock------------锁定服务数据库
          QueryLock-------查询 SCManager 数据库的 LockStatus
示例:
        sc start MyService
QUERY 和 QUERYEX 选项:
        如果查询命令带服务名称,将返回
        该服务的状态。其他选项不适合这种
        情况。如果查询命令不带参数或
        带下列选项之一,将枚举此服务。
    type=    要枚举的服务的类型(driver, service, all)
            默认 = service)
    state=  要枚举的服务的状态 (inactive, all)
            (默认 = active)/n"
    bufsize= 枚举缓冲区的大小(以字节计)
            (默认 = 4096)
    ri=      开始枚举的恢复索引号/n"
            (默认 = 0)
    group=  要枚举的服务组
            (默认 = all groups)
句法示例
sc query                - 枚举活动服务和驱动程序的状态
sc query messenger      - 显示信使服务的状态
sc queryex messenger    - 显示信使服务的扩展状态
sc query type= driver  - 仅枚举活动驱动程序
sc query type= service  - 仅枚举 Win32 服务
sc query state= all    - 枚举所有服务和驱动程序
sc query bufsize= 50    - 枚举缓冲区为 50 字节
sc query ri= 14        - 枚举时恢复索引 = 14
sc queryex group= /"/"  - 枚举不在组内的活动服务
sc query type= service type= interact - 枚举所有不活动服务
sc query type= driver group= NDIS    - 枚举所有 NDIS 驱动程序
设置服务状态:
语法:
sc <server> config [service name] <option1> <option2>...
CONFIG OPTIONS:
NOTE: The option name includes the equal sign.
type= <own|share|interact|kernel|filesys|rec|adapt>
start= <boot|system|auto|demand|disabled>
error= <normal|severe|critical|ignore>
binPath= <BinaryPathName>
group= <LoadOrderGroup>
tag= <yes|no>
depend= <Dependencies(separated by / (forward slash))>
obj= <AccountName|ObjectName>
DisplayName= <display name>
password= <password>

例:sc config servicename start= auto
本文将较为详细的介绍如何在.net下开发Windows服务程序,并将简要介绍一些开发中的调试技巧及后期的部署问题.

  IDE:VS2005, DotNetFramework Version:2.0.50727

  Windows服务程序通常是一种在OS的后台长期运行的程序,根据需要你可以设置为随服务器启动而同时启动等等,在传统的C/S结构的程序开发中,Windows服务更是以Server端普遍存在.在.NET应用程序中,无论是Winform下的应用还是ASP.NET,Windows服务也都非常重要,比如我们可以把一个.Net Remoting服务端封装在一个windows服务中,来达到稳定提供服务的目的.

  切入正题,首先我们来了解如何在VS下开发基于.Net的windows服务.

  实际上,在VS下建立一个windows服务程序非常的简单,微软帮我们做了80%的工作,我们所需要做的只是处理那20%的业务工作.

  首先,我们建立一个Windows Service程序,VS提供了现成的项目模版,选择Files->New->Project->Windows->Windows Service

  

  之后,你将获得两个文件Service组件和Program.cs.我们要建立服务的话,首先需要添加专用的安装组件,这步同样很简单,选择服务组件,并切换到设计模式,右键->Add Installer,生成了了安装文件,切换到设计模式,这里你将看到两个组件:ServiceInstaller和ProcessInstaller,这里没有太多需要说明的,大部分是对服务的名称,描述等信息的设置,只有2个地方需要注意下.一个是StartType,有三种选择自动,手动,禁用.如果想要自动启动,那么遍选择Automatic即可.另一个需要注意的属性是Account,选择用户,一般情况下,我们选择Local System即可.

  到现在,如果我们想要建立一个服务,实际上已经结束了,只需要在服务组件的OnStart和OnStop等函数中加上个人的业务处理.在Program.cs文件中,是如下代码:

  

  static void Main()

  

  

  

  {

  

  ServiceBase[] ServicesToRun;

  

  

  // More than one user Service may run within the same process. To add

  

  // another service to this process, change the following line to

  

  // create a second service object. For example,

  

  //

  

  //  ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};

  

  //

  

  

  ServicesToRun = new ServiceBase[]

  { new Service1() };

  

  

  ServiceBase.Run(ServicesToRun);

  

  }

  这段代码用于启动服务.

  接下来的工作就是安装服务.你可以通过制作安装包实现,或者直接通过命令行来执行安装.

  当你编译完项目后,你可以在bin/debug目录下看到扩展名为.exe的可执行文件,这就是服务程序,但直接双击是无法运行的,你需要通过特定的工具来安装它,微软提供给我们的工具就是installutil.exe.这个程序位于%SystemRoot%/Microsoft.NET/Framework//%Version%/,version指的是.net版本号.

  安装一个服务程序,我们是在命令行内键入:installutil.exe  服务程序路径.如果是要删除某个服务则是installutil.exe /u 服务程序路径.

  执行了安装操作后,我们去控制面版->管理工具->服务中就可以看到我们的服务程序了.

  

  最后,谈谈调试中的技巧.

  编写这种服务程序,调试起来非常的麻烦,而且每次有所变化后,还得频繁的去执行installutil和installutil /u命令,实际上,我们可以通过编写一些BuildEvents来大大简化这其中的烦琐工作.这里,我们在BuildEvents编写如下事件:

  net stop YourServiceName

  copy /y "$(TargetDir)" "$(ProjectDir)bin"

  "%SystemRoot%/Microsoft.NET/Framework/v2.0.50727/InstallUtil.exe" /u $(ProjectDir)bin/$(TargetFileName)

  "%SystemRoot%/Microsoft.NET/Framework/v2.0.50727/InstallUtil.exe"  $(ProjectDir)bin/$(TargetFileName)

  net start YourServiceName

  简单解释下:

  停止当前服务->把debug目录下所有东西copy到bin目录下->执行反安装操作->执行安装操作->启动服务.

  最后把该事件设置为OnSuccessfulBuild即可.

  由于是服务程序,如果想要直接debug比较的麻烦,可以通过附加进程来调试大多数代码,但是如果想要调试OnStart和OnStop方法.则只能通过其他的项目来调试.具体见这篇文章的介绍.

  实际上,我们可以直接在OnStart()方法中通过EventLog.WriteEntry("Hi,I'm wiseman");来向事件查看器中写入一些你感兴趣的信息,很大程度上可以解决debug的问题.

  本文到此结束,大致的介绍了下如何在.net下编写windows服务程序,以及一些相关的技巧.该文也是阅读我之后的某些文章需要掌握的知识,这个月我会尽量抽些时间多写几篇有关Windows服务和企业服务以及Remoting技术综合起来的应用的文章


using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Xml;
using System.IO;
namespace HDUSearch
...{
public  class IndexConfig
...{
GetValue#region GetValue
public string GetValue(string key)
...{
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(assemblyDirPath + "/Index.config");
XmlNodeList nodeList = xmlDoc.SelectSingleNode("/configuration/appSettings").ChildNodes;  //获取appSettings节点的所有子节点 
          foreach (XmlNode xn in nodeList)  //遍历所有子节点 
          ...{
XmlElement xe = (XmlElement)xn;  //将子节点类型转换为XmlElement类型 
              if (xe.GetAttribute("key").IndexOf(key) != -1)
...{
return xe.GetAttribute("value");
break;
}
}
return "";
}
#endregion
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值