使用批处理文件创建并启动Windows 7或10服务?

时间:2018-09-04 12:19:59

标签: batch-file windows-7 windows-services windows-10 command-prompt

根据此链接,

How to Create a User-Defined Service

您可以使用Windows NT资源工具包创建Windows服务。例如,如上面的链接所示,

C:\Program Files\Resource Kit\Instsrv.exe Notepad C:\Program Files\Resource Kit\Srvany.exe

但这在Windows 7或10和64位平台上不起作用,因为Windows NT资源工具包不适用于新Windows。

我能够使用此批处理文件创建Windows服务,

sc create "MyService" binPath= "C:\Program Files (x86)\MyProg\myprog.exe" start= auto DisplayName= "My Service" obj= LocalSystem

但是它不会启动Windows服务。当我尝试启动时,收到此消息,

enter image description here

Install a Windows service using a Windows command prompt?”和“ Create Windows service from executable”中的信息无效。

如何正确启动Windows服务?

1 个答案:

答案 0 :(得分:1)

Srvany.exe是一个古老的程序,据我所知,它将一直运行到Windows2003。您可能会忘记它在Windows 7/10中已经存在。

要在Windows 7/10上启动/停止服务(我正在使用acronis服务),其服务名称通常与显示名称大不相同:

停止正在运行的服务:

sc stop syncagentsrv

SERVICE_NAME: syncagentsrv
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

开始运行服务:

sc start syncagentsrv

SERVICE_NAME: syncagentsrv
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 2240
        FLAGS              :

检查服务状态:

sc query syncagentsrv

SERVICE_NAME: syncagentsrv
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

要创建您想要的服务,

sc create "MyService" binPath="C:\Program Files (x86)\MyProg\myprog.exe" start=auto DisplayName="My Service"

这仅创建服务并将记录添加到注册表/ serviceDB中。您需要检查exe文件本身。

您不需要 obj = LocalSystem ,因为这是默认选项。不要在等号=和值之间创建空格!

您是否检查了事件查看器?启动服务时会说什么?只有超时? myprog.exe是否可以单独工作而不提供服务?请回答这些问题,我将编辑答案。

Edit1 / 2 (基于评论),您是否对上述方法有任何困难

有一个名为SrvStart的小实用程序(最初来自Nick Rozanski),但是现在已针对VS 2017进行了修改(获取srvstart.v120.zip,需要进行构建)。如果您对旧版本满意,并已经提供了exe文件,请下载srvstart_run.v110.zip,然后将* .exe文件和* .dll复制到目录中,如下所示。

将所有文件复制到 C:\ Windows (是,您的Windows目录)。原因是C:\ Windows应该始终位于您的PATH中,以便SrvStart可执行文件可以访问。

现在创建一个MyProg.ini文件:

[MyService] startup =“ C:\ Program Files(x86)\ MyProg \ myprog.exe” shutdown_method = winmessage

winmessage会在您关闭服务时强制关闭所有打开的窗口。

然后将*.ini文件直接放到根c:\中。

然后使用命令:

sc create <servicename> Displayname= "<servicename>" binpath= "srvstart.exe <servicename> -c <path to srvstart config file>" start= <starttype>

在您的情况下,它将是:

sc create "MyService" DisplayName="My Service" binPath="srvstart.exe MyService -c C:myprog.ini" start=auto 

注意:在\C:之间没有反斜杠(myprog.ini)。

现在检查您的服务,您应该在此处看到“我的服务”名称,它的行为应类似于服务。

编辑3-基于@CodenameK的注释

显然,您需要使用VS2017编译的srvstart 120版本,以使其在@ Win10上正确运行。唯一可用的版本是旧的1.1版本,在Win10上似乎无法正常工作。

适用于CodenameK的解决方案是使用-NSSM - the Non-Sucking Service Manager。如果有人需要,以备将来参考。