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编写服务程序的主要内容,如果未能解决你的问题,请参考以下文章