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、开机自启动的设置

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

原文地址:https://www.cnblogs.com/Sheenagh/p/12219416.html

时间: 2024-10-09 20:06:35

C编写服务程序的相关文章

DELPHI编写服务程序总结

一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统服务是运行在System Idle Process/System/smss/winlogon/services下的,而桌面程序是运行在Explorer下的:系统服务拥有更高的权限,系统服务拥有Sytem的权限,而桌面程序只有Administrator权限:在Delphi中系统服务是对桌面程序进行了再一次的封装,既系统服务继承于桌

C编写服务程序详细步骤

1.简介 Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择.C++面向对象的方法固然方便,但由于用类对底层 Win32 函数调用进行了封装,它不利于学习服务程序的基本知识. 服务是一个运行在后台并实现勿需用户交互的任务的控制台程序.Windows NT/2000/XP 操作系统提供为服务程序提供专门的支持. 2.步骤 2.1 主函数和全局定义 包含所需的头文件.要调用 Win32 函数(window

BCB 编写服务程序的一个注意事项

  BCB编写服务,install报错的一个问题 今天编写了一个服务,最后INSTALL 的时候报错,如图: 经过近1小时的比较(俺过去写例子),居然无意中设置了一个属性                     查看BCB 的帮助.ServiceStartName 从文档大意,可知道,就是用与启动服务的名字.当时没看懂,查了msdn   当我看到Account终于明白了,原来指的是启动服务的账户(叫什么ServiceStartName? 叫ServiceStartAccount 不好?) 说白了

编写服务程序所遇到的问题

1.How to Create a Windows NT/ Windows 2000 Service翻译描述 网址: http://blog.csdn.net/delphiwcdj/article/details/4581671 1.VS2008 CLR 建立WINDOWS服务程序 调用外部EXE文件 网址: https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/1876f300-16e5-49d6-b79e-b2c37e8806b8/vs

windows下服务程序相关(别人提供的5种封装使用)

作者: daodaoliang 版本: V 0.0.1 日期: 2017年11月25日 1. Windows Service 编程实现 在windows平台下面编写 服务程序 免不了要去查看微软的开发者文档,相关的介绍在这里, 多了也就不在罗嗦了,如果你嫌弃直接用他们的API的话,可以使用别人已经封装好的,比如: 参考代码 连接 参考代码001 https://github.com/magicsih/WindowsService 参考代码002 https://github.com/Olster

java RMI入门指南

感觉这篇文章不错,直接转了 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方式之中的一个.事实上它能够被看作是RPC的Java版本号.可是传统RPC并不能非常好地应用于分布式对象系统.而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信.实现远程对象之间的无缝远程调用. RMI眼下使用Java远程消息交换协议JRMP

STM32中断控制的流程

对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) .输入捕获.输出匹配.DMA 申请等.所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的.不同的.中断申请呢? 1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单

Java接口技术

1.RMI技术 1.1 RMI技术介绍 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一.其实它可以被看作是RPC的Java版本.但是传统RPC并不能很好地应用于分布式对象系统.而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用. RMI目前使用Java远程消息交换协议JRMP

Windows RPC

转载 Windows RPC Demo实现 本文参考并整理以下相关文章 1. <远程过程调用> -百度百科 2. <RPC 编程> -http://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/ 3. <微软官方参考教程> -http://blog.csdn.net/swanabin/article/details/18766209 1 概念 RPC:全称是“远程过程调用协议(Remote Pr