C编写服务程序

Posted sheenagh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C编写服务程序相关的知识,希望对你有一定的参考价值。

一、问题

1、[SC] OpenSCManager 失败 5:拒绝访问。
  以管理员身份运行
2、net start test发生系统错误 2。系统找不到指定的文件。
  1)查看exe文件的路径是否正确?最好使用全路径。
若修改服务路径可执行:sc delete 服务名,sc create 服务名 binPath= ""进行重新安装
3、net start serverProgram服务没有响应控制功能。或者提示:错误1053:服务没有及时响应启动或控制请求。
  原因:运行作为服务的应用程序不是按服务的流程写的
  解决:完成服务程序的代码编写,编译后即可启动服务

二、步骤

  1、使用VS创建一个Win32控制台程序
  2、编写好服务程序,Build编译好,生成exe文件
  3、以管理员身份打开cmd命令窗口,执行:sc create test binPath= 编译成功后的可执行文件的路径
    到此就创建了一个服务。窗口提示:[SC] CreateService 成功
    注意:"="后一定要空一格,否则会出现错误
  4、开始--运行--services.msc->回车,即可查看到刚刚创建的服务

三、sc命令

  SC 是用于与服务控制管理器和服务进行通信的命令行程序。

3.1 用法

  sc <server> [command] [service name] <option1> <option2>...

3.2 命令

  query-----------查询服务的状态,或枚举服务类型的状态。
  queryex---------查询服务的扩展状态, 或枚举服务类型的状态。
  start-----------启动服务。
  pause-----------向服务发送 PAUSE 控制请求。
  interrogate-----向服务发送 INTERROGATE 控制请求。
  continue--------向服务发送 CONTINUE 控制请求。
  stop------------向服务发送 STOP 请求。
  config----------更改服务的配置(永久)。
  description-----更改服务的描述。
  failure---------更改失败时服务执行的操作。
  failureflag-----更改服务的失败操作标志。
  sidtype---------更改服务的服务 SID 类型。
  privs-----------更改服务的所需特权。
  managedaccount--更改服务以将服务帐户密码标记为由 LSA 管理。
  qc--------------查询服务的配置信息。
  qdescription----查询服务的描述。
  qfailure--------查询失败时服务执行的操作。
  qfailureflag----查询服务的失败操作标志。
  qsidtype--------查询服务的服务 SID 类型。
  qprivs----------查询服务的所需特权。
  qtriggerinfo----查询服务的触发器参数。
  qpreferrednode--查询服务的首选 NUMA 节点。
  qmanagedaccount-查询服务是否将帐户与 LSA 管理的密码结合使用。
  qprotection-----查询服务的进程保护级别。
  quserservice----查询用户服务模板的本地实例。
  delete ----------(从注册表中)删除服务。
  create----------创建服务(并将其添加到注册表中)。
  control---------向服务发送控制。
  sdshow----------显示服务的安全描述符。
  sdset-----------设置服务的安全描述符。
  showsid---------显示与任意名称对应的服务 SID 字符串。
  triggerinfo-----配置服务的触发器参数。
  preferrednode---设置服务的首选 NUMA 节点。
  GetDisplayName--获取服务的 DisplayName。
  GetKeyName------获取服务的 ServiceKeyName。
  EnumDepend------枚举服务依赖关系。

以下命令不需要服务名称:
  sc <server> <command> <option>
boot------------(ok | bad)指示是否应将上一次启动另存为
最近一次已知的正确启动配置
Lock------------锁定服务数据库
QueryLock-------查询 SCManager 数据库的 LockStatus
示例:
sc start MyService


QUERY 和 QUERYEX 选项:
如果查询命令带服务名称,将返回该服务的状态。其他选项不适合这种情况。如果查询命令不带参数或带下列选项之一,将枚举此服务。
type= 要枚举的服务的类型(driver, service, userservice, all)
(默认 = service)
state= 要枚举的服务的状态 (inactive, all)
(默认 = active)
bufsize= 枚举缓冲区的大小(以字节计)
(默认 = 4096)
ri= 开始枚举的恢复索引号
(默认 = 0)
group= 要枚举的服务组
(默认 = all groups)

语法示例
sc query - 枚举活动服务和驱动程序的状态
sc query eventlog - 显示 eventlog 服务的状态
sc queryex eventlog - 显示 eventlog 服务的扩展状态
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= interact - 枚举所有不活动服务
sc query type= driver group= NDIS - 枚举所有 NDIS 驱动程序

3.2.1 sc config命令

在注册表和服务数据库中修改服务项。
用法:
  sc <server> config [服务名称] <option1> <option2>...

选项:
注意: 选项名称包括等号。
等号和值之间需要一个空格。
要删除依赖关系,请使用单个“/”表示依赖关系值。
type= <own|share|interact|kernel|filesys|rec|adapt|userown|usershare>
start= <boot|system|auto|demand|disabled|delayed-auto>
error= <normal|severe|critical|ignore>
binPath= <.exe 文件的 BinaryPathName>
group= <LoadOrderGroup>
tag= <yes|no>
depend= <依赖关系(以 / (正斜杠)分隔)>
obj= <AccountName|ObjectName>
DisplayName= <显示名称>
password= <密码>

4、启动服务

  1)开始--运行--services.msc->回车,找到创建的服务,右键启动
  2)命令窗口提示创建成功后,执行net start 服务名
  按照示例程序会生成一个txt文件,但在执行net stop前不会写入内容。stop后再start会清除之前的内容重新写入

5、停止/删除服务

  net stop 服务名:此时服务还可在服务窗口中查看到,对应的txt文件写入内容
  sc delete 服务名:此时在服务窗口查看不到删除的服务名

6、开机自启动的设置

  设置服务的启动类型为自动

以上是关于C编写服务程序的主要内容,如果未能解决你的问题,请参考以下文章

如何利用VB编写NT服务程序

用C语言编写Windows服务程序的五个步骤

用纯C代码编写一个简单的HTTP客户端向服务器请求数据

求C++编写的自动升级程序C/S结构

具有共享内存和文件作为数据库的 IPC V 客户端/服务器应用程序,用 C 编写

C语言编写的程序,怎样隐藏运行,不弹CMD窗口