在windows下把一个exe可执行文件注册为系统服务有很多种方法,常用的有sc命令、instsrv+srvany以及本文重点介绍的nssm。
这阵子为单位编写了一个小工具,作用是禁止Windows系统访问因特网,只允许使用内部的局域网。分发到用户电脑里时,要实现开机自启动和防止人工杀进程。一开始我采用写注册表的方式实现自启动,但是这有两个不足:
①容易被杀软拦截,杀软对自启动的第三方工具非常敏感。
②隐蔽性不高。注册表自启动的项目虽然不会出现在开始菜单的“启动”里,但是在任务管理器的“启动”里能看的到(虽然我实现了守护注册表的功能,是没办法轻易删掉注册表键值的,不过一些有洁癖的用户还是会想方设法把它去掉)。
所以最终放弃了注册表自启动方式,改为把程序注册为系统服务。
(1)sc命令
这是Windows自带的命令,可以把exe注册为系统服务,命令格式也很明晰,结构如下:
sc create SVN 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:abcsrvany.exe
这只是第一步,然后还要在注册表里新增Parameters子键,并添加AppDirectory和AppParameters两个键值,具体的大家自行search。
由于该组合过于古老,在Win10上出现了兼容性问题,具体点说,就是instsrv注册服务时添加的srvany绝对路径是不带双引号的,如下:
c:abcsrvany.exe
而Win10能识别的格式是这样的:
"c:abcsrvany.exe"
区别就在于一对双引号,这让我花了1整天时间才弄明白,坑死了。
但上面这个问题不是致命的,致命的是,该神仙组合不能守护进程。轻轻一点,我们想要运行在后台的程序就拜拜了。虽然我的程序有守护组件能重启主程序,但是这个加载器的自身功能还是弱了一些。自己用没问题,发布到用户手里还是下面的nssm靠谱一些。
(3)nssm,全称non-sucking server manager
NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。它几乎可以把任何exe封装成系统服务(有界面和对话框的不适合这么做),还能守护这个第三方程序不被杀掉,而且还有图形操作界面,方便小白使用。
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