并不是每个程序都能作为服务启动的,不信大家可以随便拿一个程序,添加到服务中
服务添加实际上很容易,系统已经给出了一个很简单的命令——sc
让我们来看下WIN7系统下的用法【XP中是英文】:
描述:
SC 是用于与服务控制管理器和服务进行通信的命令行程序。
用法:
sc <server> [command] [service name] <option1> <option2>
选项 <server> 的格式为 "\\ServerName"
键入 "sc [command]" 可以获得有关命令的进一步帮助
命令:
query———–查询服务的状态,
或枚举服务类型的状态。
queryex———查询服务的扩展状态,
或枚举服务类型的状态。
start———–启动服务。
pause———–向服务发送 PAUSE 控制请求。
interrogate—–向服务发送 INTERROGATE 控制请求。
continue——–向服务发送 CONTINUE 控制请求。
stop————向服务发送 STOP 请求。
config———-更改服务的配置(永久)。
description—–更改服务的描述。
failure———更改服务失败时执行的操作。
failureflag—–更改服务的失败操作标志。
sidtype———更改服务的服务 SID 类型。
privs———–更改服务的所需权限。
qc————–查询服务的配置信息。
qdescription—-查询服务的描述。
qfailure——–查询失败时服务执行的操作。
qfailureflag—-查询服务的失败操作标志。
qsidtype——–查询服务的服务 SID 类型。
qprivs———-查询服务的所需权限。
qtriggerinfo—-查询服务的触发器参数。
qpreferrednode–查询首选的服务 NUMA 节点。
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
创建一个服务很简单,命令格式:
sc create 【替换为服务名称,不同于显示名称,具体你在系统的服务管理中就可以看出差别了】 binpath= "【执行文件路径】" start=【初始启动状态,可选boot|system(前面几个都是较为内核的,不管)|auto|demand|disabled|delayed-auto(仅WIN7)】此外还可以加上显示名称displayname= "【显示名称】"
例如创建notepad为系统服务,并开机自动运行
sc create notepad binpath= "c:\windows\system32\notepad.exe" start= auto displayname= "notepad服务"
创建好后,在计算机管理中试图启动它,会出现什么呢?
你会发现,没反应,且在进程列表中已经有了
过了一下,会弹一个框:
并且在进程中消失
好了,测试完了,打扫战场,删除服务即可:
sc delete notepad【你可以注意到我用的是服务名称,不是显示名称(显示名称是用作显示的)】
PS:以上种种示例在Vista和Win7都需要管理员权限
可见,普通程序是不能直接加入服务的
从提示框我们可以看出,是因为程序没有应答SCManage的启动。打个比方,我喊你跑了,你听到了并跑了。但是却没有给我说我已经跑了,于是我认为你没有正常的跑,又叫你停下来了
怎么告诉SCManage程序已经启动了呢?C、C++都提供了很多方法,但是VB是以简单著称,最简单的方法就是使用NTSVC.OCX
安装方法:
解压到C:\Windows\System32
在cmd下输入regsvr32 NTSVC.OCX,即注册成功
在VB工程菜单中找到部件——找到Microsoft NT Service Control,打上勾
便会发现在左侧工具栏中多了一个齿轮标志:就是它了
拖到界面上,就可以使用了
使用方法:
先点齿轮在右侧属性写上你的服务的描述和Service name等【不填也可以,如果你想让程序自身就具备自我创建、删除服务的功能,这些必须得填】
由于程序一运行就要回应系统的“召唤”,所以我们需要在Form_Load()代码中加入一句【越快越好^_^】:
NTService1.StartService
这样,按照前面方法增加服务,启动服务,你就会发现进度条一闪就过了
如何让程序自身具备创建服务的功能呢?
很简单,首先你得判断运行你的参数,例如/install /uninstall和没有参数
If Command = "/install" Then
NTService1.Interactive = True
NTService1.Install ‘【创建服务】
就像这样
没有参数就执行NTService1.StartService就好了
如果想让服务能够接受暂停和继续的命令,就加上一句:
NTService1.ControlsAccepted = svcCtrlPauseContinue
加上后,就意味着要为此写上代码
Private Sub NTService1_Pause(Success As Boolean)
‘在此加上暂停后的行为,停止做些什么
Success = True ‘返回SCM一个成功暂停服务的消息
End Sub
Private Sub NTService1_Start(Success As Boolean)
‘在此加上服务接受到继续命令后的行为
Success = True ‘返回SCM一个使服务继续运行的消息
End Sub
还有就是诸如Private Sub NTService1_Stop(),同理也就可以了
如果要让服务启动后停止,并要告诉SCM,怎么做呢?
Private Sub Form_Load()
NTService1.StartService
‘…..
NTService1.StopService
End Sub
此时运行服务,就会提示该服务启动后又停止了,而不是提示进程意外终止
End…
评论
我是XP系统,按照上面命令创建服务,但是管理中却没有notepad这项服务。命令后面出现help的信息。也没有说执行失败之类的。
凤翎
C:\Documents and Settings\Administrator>sc create notepad binpath= "c:\windows\s
ystem32\notepad.exe" start= auto displayname= "notepad服务"
[SC] CreateService SUCCESS
确定没有少复制些啥么?
:no :qian :smoke :tanqi :tian :tian