太阳当空照-Windows服务化方式instsrv与srvany

前言

之前的文章中,涉及到服务化部分太阳当空照-Windows服务化sc.exe以及太阳当空照-Windows服务化方式脚本封装sc指令两章博文内容中,分别简单讲解了,使用sc.exe在符合Windows服务化的要求的应用程序前提下,实现服务的注册和运行,以及实现自定义sc指令的脚本化操作方式,引导式地对服务实现基本操作,同样的哪怕是提高交互体验,本质上,sc局限性也是很明显的,对能够实现服务化程序有直接要求,如果是现有需要服务化的应用程序并不支持服务化,哪怕直接注册,对应服务也无法启动成功,这在实际使用过程中,三方的应用程序服务化,尤为明显,于是乎,晚上查找到查找到包含在微软Microsoft Windows Resource Kit Toolsinstsrv.exesrvany.exe,通过一篇文章Gist:https://gist.github.com/eyecatchup/0107bab3d92473cb8a3d3547848fc442得知这个微软提供的工具包是针对的Windows Server以及Windows XP,高版本系统以后,没有与之定义版本,只能使用老版本rktools.exe进行安装,而rktools.exe实际就是Microsoft Windows Resource Kit Tools全家桶的简称,原文内容如下:

Additional Information

Though the available RK-Tools package is named “Microsoft® Windows® Server 2003 RK-Tools” and it was specifically released for Server 2003, all tools have official and full Windows® XP support, too.

Unsupported OS Versions

Though not officially supported, you can also install the RK-Tools Server 2003 bundle on Windows® Vista, Windows® 7 and Windows® 10, but note that some of the tools will not work as intended or not work at all (e.g. some tools generate errors like Dll missing).

Notes for Windows® 7

In Windows® 7, when you launch the installer, you will get an error saying This program has known compatibility issues. Just ignore the warning and click Run program and continue with installation.

对应的全家桶包,请留下评论或私信笔者进行获取

ggcy-blog-service-sc-header

安装rktools

需要注意的是,安装步骤不是必须项,如果本地目录C:\Program Files (x86)\Windows Resource Kits\Tools\已存在,则本机已经安装对应工具包,可以跳过此步骤,转到下一步,程序服务化注册

左键双击运行rktools.exe

blog-jrz-instsrvany-install01

blog-jrz-instsrvany-install02

依据提示信息,填写当前用户信息,无特殊要求

blog-jrz-instsrvany-install03

安装默认路径为C:\Program Files (x86)\Windows Resource Kits\Tools\

blog-jrz-instsrvany-install04

点击安装后,Windows 10会提示是否安装来之某一个路径下的rktools.msi,确认安装,选择是,否则选择否

blog-jrz-instsrvany-install05

blog-jrz-instsrvany-install06

查看系统环境变量中,Pathpath已经包含了对应的全家桶安装目录,没有就自己手动添加

blog-jrz-instsrvany-env-path

安装完成之后,转到上述的安装目录中,发现已经包含instsrv.exesrvany.exe,或者打开cmd指令执行指令

>instsrv /?
Installs and removes system services from NT

INSTSRV <service name> (<exe location> | REMOVE)
  [-a <Account Name>] [-p <Account Password>]

  Install service example:

    INSTSRV MyService C:\MyDir\DiskService.Exe
    -OR-
    INSTSRV MyService C:\mailsrv\mailsrv.exe -a MYDOMAIN\joebob -p foo

  Remove service example:

    INSTSRV MyService REMOVE

工具简述

instsrv.exe

安装和删除系统服务,允许为Windows NT应用程序和某些32为应用程序(非批处理文件),创建Windows NT用户定义的服务

>instsrv /?
Installs and removes system services from NT

INSTSRV <service name> (<exe location> | REMOVE)
  [-a <Account Name>] [-p <Account Password>]

  Install service example:

    INSTSRV MyService C:\MyDir\DiskService.Exe
    -OR-
    INSTSRV MyService C:\mailsrv\mailsrv.exe -a MYDOMAIN\joebob -p foo

  Remove service example:

    INSTSRV MyService REMOVE

srvany.exe

允许Windows NT应用程序作为服务运行,实际上srvany.exe是作为目标程序的服务套壳程序,用于接受服务操作的相关指令,实现被包壳程序的运行和停止,与instsrv.exe一起使用

创建自定义服务

>[path]\instsrv.exe [servicename] [path]\srvany.exe

path对应实际的instsrv.exesrvany.exe所属目录,依据上述rktools.exe方式安装,不需要进行设置,默认配置了系统环境变量

servicename为需要注册的服务名称,由用户自定义

案例

此处以nginx.exe实现服务化为例子,nginx.exe所在目录为D:\Program Files\nginx-1.21.1nginx.conf配置文件内容如下,访问端口为7080

.....省略......
http {
.....省略......
    server {
        listen       7080;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
.....省略......
    }
}

以管理员身份启动cmd,执行如下指令,否则将执行指令失败,提示You are not authorized to do this - please contact your system Administrator,意思是当前账户没有权限执行这个服务操作,需要管理员权限

>instsrv nginx  "C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"
The service was successfuly added!

Make sure that you go into the Control Panel and use
the Services applet to change the Account Name and
Password that this newly installed service will use
for its Security Context.
查询服务
方式一
sc query nginx

SERVICE_NAME: nginx
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
方式二

打开【任务管理器】-【服务】,可以查找到一个名为nginx的服务,当前状态为停止状态

blog-jrz-instsrvany-registsrv

方式三

查看注册表

执行regedit.exe,查看注册表,查找对应注册清单中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[servicename](此处为nginx)对应的ImagePath是否为C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe

如果是,则表示,服务注册成功

配置服务[修改前先导出备份]
备份

服务注册成功之后,需要进行对应的服务程序配置,由于注册表配置属于比较危险的操作,配置错误有可能影响到系统的正常使用,修改前,先对目标nginx进行导出备份处理,操作如下,【选中nginx节点】-单击右键【导出】特定位置保留一个xxx.reg文件,此处设置为nginx.reg

添加配置

nginx节点下,添加,名称为Parameters

之后在Parameters下添加几个字符串值

AppDirectory表示服务运行的工作目录

Application表示服务程序对应的物理地址

AppParameters表示服务运行携带的默认参数,默认为空值

结果如下:

blog-jrz-instsrvany-cfglist

启动服务
方式一

配置好之后,尝试通过管理员权限运行cmd,进行服务nginx的运行

>sc start nginx

SERVICE_NAME: nginx
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0
        PID                : 72712
        FLAGS              :
>sc query nginx

SERVICE_NAME: nginx
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
方式二

执行net start [servicename]进行服务启动

>net start nginx
nginx 服务正在启动 .
nginx 服务已经启动成功。
查找进程

查看实际系统中启动的对应服务所属应用进程

>tasklist /fi "imagename eq nginx.exe"
映像名称                       PID 会话名              会话#       内存使用
========================= ======== ================ =========== ============
nginx.exe                    68272 Services                   0     17,892 K
nginx.exe                    67928 Services                   0     18,204 K

浏览器访问http://localhost:7080,出现如下结果,表示服务启动成功

blog-jrz-instsrvany-runsrv

停止服务
方式一

使用sc stop [servicename]

>sc stop nginx

SERVICE_NAME: nginx
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
方式二

使用net stop [servicename]

>net stop nginx
nginx 服务正在停止.
nginx 服务已成功停止。
查看进程

服务正常停止时,查看结果

>tasklist /fi "imagename eq nginx.exe"
信息: 没有运行的任务匹配指定标准。

此处nginx属于多进程,结束服务自后,实际上本地还有进程并未完全退出

>tasklist /fi "imagename eq nginx.exe"
映像名称                       PID 会话名              会话#       内存使用
========================= ======== ================ =========== ============
nginx.exe                    38432 Services                   0     17,876 K
方式三

执行任务结束指令taskkill /T /F /IM [appname]

>taskkill /T /F  /IM nginx.exe
成功: 已终止 PID 56132 (属于 PID 70920 子进程)的进程。
成功: 已终止 PID 70920 (属于 PID 74512 子进程)的进程。
成功: 已终止 PID 74512 (属于 PID 67556 子进程)的进程。
注意

需要注意的是,方式一方式二停止服务,比较适合单进程应用程序,如果对应服务化的程序为多进程程序,改方式仅仅只能停止部分进程,例如当前案例nginx以此种方式就无法彻底结束所有进程,如果非要全部退出,可以直接使用方式三,虽然粗暴,但是确实使用,能够满足结束服务的需求

卸载服务
方式一

使用instsrv [servicename] remove

>instsrv nginx remove

The service was successfully deleted!
方式二

使用sc delete [servicename]

>sc delete nginx
[SC] DeleteService 成功

总结

笔者简单的通过本地安装rktools.exe去获取到对应的instsrv.exesrvany.exe,依靠这俩工具,实现本地不遵循Windows服务化规范的应用程序拟态(个人认为这不属于实际的应用服务化,而是对服务化状态进行模拟实现的折中功能)服务化,对应用的操作逐渐接近实现本质,如果想继续了解服务化内容,可关注笔者留言评论或私信

参考链接

【1】https://zhuanlan.zhihu.com/p/93808282

【2】https://wangye.org/blog/archives/42/

【3】https://www.cnblogs.com/zhaiqianfeng/p/4622561.html

【4】https://gist.github.com/eyecatchup/0107bab3d92473cb8a3d3547848fc442

【5】https://docs.microsoft.com/zh-cn/troubleshoot/windows-client/deployment/create-user-defined-service

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值