漩涡's Archivers

From 雨宫优子 on 2010-02-05 21:41:34

很久不更新了,汇报一下俺研究最新成果NTSVC.OCX【附下载】——让VB也能作为服务启动

并不是每个程序都能作为服务启动的,不信大家可以随便拿一个程序,添加到服务中


服务添加实际上很容易,系统已经给出了一个很简单的命令——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服务"


创建好后,在计算机管理中试图启动它,会出现什么呢?


你会发现,没反应,且在进程列表中已经有了


过了一下,会弹一个框:


<img width="454" height="204" alt="内容:没有及时相应启动请求" src="http://xuanwobbs.com.cn/wp-content/uploads/image/puhuo1.PNG" />


并且在进程中消失


好了,测试完了,打扫战场,删除服务即可:


sc delete notepad【你可以注意到我用的是服务名称,不是显示名称(显示名称是用作显示的)】


PS:以上种种示例在Vista和Win7都需要管理员权限


可见,普通程序是不能直接加入服务的


从提示框我们可以看出,是因为程序没有应答SCManage的启动。打个比方,我喊你跑了,你听到了并跑了。但是却没有给我说我已经跑了,于是我认为你没有正常的跑,又叫你停下来了


怎么告诉SCManage程序已经启动了呢?C、C++都提供了很多方法,但是VB是以简单著称,最简单的方法就是使用NTSVC.OCX


安装方法:


点此下载NTSVC.OCX


解压到C:\Windows\System32


在cmd下输入regsvr32 NTSVC.OCX,即注册成功


在VB工程菜单中找到部件——找到Microsoft NT Service Control,打上勾


便会发现在左侧工具栏中多了一个齿轮标志:<img width="24" height="23" src="http://xuanwobbs.com.cn/wp-content/uploads/image/puhuo2.PNG" alt="齿轮" />就是它了


拖到界面上,就可以使用了


使用方法:


先点齿轮在右侧属性写上你的服务的描述和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...

查看完整版本: 很久不更新了,汇报一下俺研究最新成果NTSVC.OCX【附下载】——让VB也能作为服务启动

From 凤翎 on 2010-04-21 16:15:18

我是XP系统,按照上面命令创建服务,但是管理中却没有notepad这项服务。命令后面出现help的信息。也没有说执行失败之类的。

From 雨宫优子 on 2010-04-22 12:04:29

C:\Documents and Settings\Administrator>sc create notepad binpath= "c:\windows\s ystem32\notepad.exe" start= auto displayname= "notepad服务" [SC] CreateService SUCCESS 确定没有少复制些啥么?

From t6 on 2011-01-29 20:10:19

:no :qian :smoke :tanqi :tian :tian

Tags: vb


©漩涡网络安全实验室