batch-file - 使用批处理文件创建和启动 Windows 7 或 10 服务?

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

根据这个链接,

How to Create a User-Defined Service

您可以使用 Windows NT Resource Kit 创建 Windows 服务。例如如上链接所示,

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

但这在 Windows 7 或 10 和 64 位平台中不起作用,因为 Windows NT Resource Kit 不适用于新的 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 服务?

最佳答案

Srvany.exe是一个古老的程序,据我所知,它会一直工作到 windows 2003。你可以忘记它存在于 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"

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

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

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

编辑 1/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 文件:

[我的服务]
启动="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 .如果有人需要,以供将来引用。

关于batch-file - 使用批处理文件创建和启动 Windows 7 或 10 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52166216/

相关文章:

c# - 设置并发作业的最大值 Quartz.Net

windows - 批处理文件标记忽略空分隔符

windows-7 - NSIS:无法在 Windows 7 上写入注册表 (HKLM\Software\...)

windows - 在 Windows 中使用 pandoc 批量转换文件

visual-studio-2010 - 在 Visual Studio 中打开解决方案时出现 WiX 项目错误

java - Tomcat 7.0.47 - Windows - 缺少未处理的异常/堆栈跟踪

windows-services - Visual Studio 11 BETA 不支持 Windows Installer 项目

javascript - 如何在 Node js 应用程序中安装和管理 Windows 服务?

shell - Powershell 模块和调用文件

windows - 在不使用 nircmd 实用程序的情况下移动任何打开的应用程序在 Windows 批处理文件中的位置