在Windows下把一个exe可执行文件注册为系统服务有很多种方法,常用的有sc命令、instsrv+srvany以及本文重点介绍的nssm。


♥引言

这阵子为单位编写了一个小工具,作用是禁止Windows系统访问因特网,只允许使用内部的局域网。分发到用户电脑里时,要实现开机自启动和防止人工杀进程。一开始我采用写注册表的方式实现自启动,但是这有两个不足:

①容易被杀软拦截,杀软对自启动的第三方工具非常敏感。

②隐蔽性不高。注册表自启动的项目虽然不会出现在开始菜单的“启动”里,但是在任务管理器的“启动”里能看的到(虽然我实现了守护注册表的功能,是没办法轻易删掉注册表键值的,不过一些有洁癖的用户还是会想方设法把它去掉)。

所以最终放弃了注册表自启动方式,改为把程序注册为系统服务。

♥三种方式简介

(1)sc命令

这是Windows自带的命令,可以把exe注册为系统服务,命令格式也很明晰,结构如下:


sc create 服务名称 binpath="exe程序的完整路径" displayname="服务描述" start=auto



其中:

sc create:是sc注册服务命令
SVN : 是你给这个服务起的名字
binpath : 是exe文件的路径和命令参数
displayname :是服务的别名
start :是否自动启动

可以说这是一个非常绿色环保的命令,不需要借助第三方工具就能轻松实现。但是sc命令有一个致命的缺点,这个缺点就是被它注册的这个exe程序必须符合系统服务的规范,否则是无法启动的。我只是一个老菜鸟,而且根本没时间研究系统服务的规范,所以只能拜拜了。

(2)神器instsrv+srvany

这是一对神仙组合,提取自Windows2003的tool kits,有将近20年了,但是目前依然能用。

instsrv用于注册一个系统服务,srvany用于加载该服务引用的第三方exe程序。

操作命令如下:


instsrv.exe 要注册的服务名称 c:\abc\srvany.exe


这只是第一步,然后还要在注册表里新增Parameters子键,并添加AppDirectory和AppParameters两个键值,具体的大家自行search。

由于该组合过于古老,在Win10上出现了兼容性问题,具体点说,就是instsrv注册服务时添加的srvany绝对路径是不带双引号的,如下:


c:\abc\srvany.exe


而Win10能识别的格式是这样的:


"c:\abc\srvany.exe"


区别就在于一对双引号,这让我花了1整天时间才弄明白,坑死了。

但上面这个问题不是致命的,致命的是,该神仙组合不能守护进程。轻轻一点,我们想要运行在后台的程序就拜拜了。虽然我的程序有守护组件能重启主程序,但是这个加载器的自身功能还是弱了一些。自己用没问题,发布到用户手里还是下面的nssm靠谱一些。

(3)nssm,全称non-sucking server manager

NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。它几乎可以把任何exe封装成系统服务(有界面和对话框的不适合这么做),还能守护这个第三方程序不被杀掉,而且还有图形操作界面,方便小白使用。


♥nssm的简单范例

nssm的命令行操作非常简单,两步就能加载应用程序了。下面以把D:\abc.exe注册成系统服务为例。

①封装第三方应用为系统服务:


nssm install 服务名称 D:\abc.exe


执行完这一步,nssm会自动在注册表中建立Parameters子键,并添加AppDirectory和AppParameters两个键值,所以如果没有其他特殊需求,这一句就搞定了。



②启动第三方程序


nssm start 服务名称


tips:上面提到的”服务名称“四个字,最好是使用英文或数字,这样不会有兼容性问题。

其他常用的命令有:

修改服务名称:nssm set DisplayName 用于用户查看的服务名称

修改服务描述:nssm set Description 这里跟一段该服务的文字描述,支持中文

删除某个服务:nssm remove 服务名称 confirm

其他更多参数的使用,请参阅官方网页:

https://nssm.cc/commands


点赞(1563)

评论列表共有 0 条评论

立即
投稿
返回
顶部