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

Create and start Windows 7 or 10 service using batch file?

根据 How to Create a User-Defined Service,您可以使用 Windows NT Resource Kit 创建一个 Windows 服务。比如上图link:

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 服务。当我尝试开始时收到此消息:

Windows could not start the OrchestrateIT Import Service service on Local Computer.

Error 1053: The service did not respond to the start or control request in a timely fashion.

Install a Windows service using a Windows command prompt?中的信息 从可执行文件创建 Windows 服务 不起作用。

如何成功启动Windows服务?

Srvany.exe 是一个古老的程序,据我所知,它可以工作到 Windows 2003 年。你可以忘记它在 Windows 7/10 之前就存在了。

到 start/stop Windows 7 月 10 日的服务(我正在使用 Acronis 服务),其服务名称通常与显示名称完全不同:

正在停止 运行ning 服务:

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

正在启动 运行ning 服务:

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"

这只会创建服务并将记录添加到 Registry/serviceDB。您需要检查 exe 文件本身。

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

您检查过事件查看器了吗?启动服务时它说什么?只有超时? myprog.exe 是否在不作为服务的情况下单独工作?请回答这些问题,我会编辑答案。

根据评论编辑 1 和 2 如果您对上述方法有任何困难

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

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

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

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

    winmessage 在您关闭服务时强制关闭任何打开的 windows。

  3. 然后将 *.ini 文件直接放入根目录 c:\

  4. 然后使用命令:

    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 之间没有反斜杠(\)是正确的。

  5. 现在检查您的服务,您应该在那里看到“我的服务”名称,它应该像服务一样工作。

根据@CodenameK 的评论编辑 3

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

适用于 CodenameK 的解决方案是使用 NSSM - the Non-Sucking Service Manager。以备日后有需要者参考。