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

Posted

技术标签:

【中文标题】使用批处理文件创建和启动 Windows 7 或 10 服务?【英文标题】:Create and start Windows 7 or 10 service using batch file? 【发布时间】:2019-02-09 11:35:09 【问题描述】:

根据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 资源工具包不适用于较新的 Windows 版本。我能够使用这个批处理文件创建 Windows 服务:

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

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

Windows 无法在本地计算机上启动 OrchestrateIT 导入服务服务。

错误 1053:服务没有及时响应启动或控制请求。

Install a Windows service using a Windows command prompt? 和 Create Windows service from executable 中的信息不起作用。

如何成功启动Windows服务?

【问题讨论】:

包含空格的路径应该用双引号括起来。 它确实有双引号,如果你有 Windows NT 资源工具包,它就可以工作。但这在 Windows 7 和 Windows 10 中不可用。 代号 K,除非我的设备有问题,否则您显示为无效的命令绝对没有任何双引号! 我显示的命令“Instsrv.exe”来自 Windows NT 资源工具包。这是以前安装 Windows 服务的方式。但是 Windows NT Resource Kit ("Instsrv.exe") 在 Windows 7 和 Windows 10 中不可用。问题是如何在 Windows 7 或 Windows 10 中创建服务?有什么替代方法吗? 因此,您的问题不是关于您的代码的特定问题,而是关于该特定站点的软件和题外话。相反,您应该在 Super User 上提问。 【参考方案1】:

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"

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

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

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

编辑 1 & 2 基于 cmets,如果您对上述方法有任何困难

有一个名为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 之间没有反斜杠 (\),这是正确的。

    现在检查您的服务,您应该会在那里看到“我的服务”名称,它的行为应该像服务一样。

根据来自@CodenameK 的 cmets 编辑 3

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

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

【讨论】:

@CodenameK 是的,这很自然,还有其他吗?您是否尝试手动运行 exe 文件?它运行正确吗? @CodenameK 您是否有任何来自应用程序的日志确认?如果它在该用户下执行时有效,则可能是用户权限问题。尝试使用该用户的凭据创建服务,而不是 LocalSystem(您是否尝试在 LocalSystem 下运行它?) @CodenameK 对于应用程序程序员来说,这是更多的问题,它应该如何作为服务运行。当我什至不知道该应用程序时,很难猜到这一点。例如,我们正在使用“技术”管理帐户运行我们的一个旧应用程序,该帐户允许该应用程序拥有所需的所有必要权限。 @CodenameK 好的,我将编辑答案并向您展示另一种方法。 @CodenameK 你可以试试edit里写的方法。

以上是关于使用批处理文件创建和启动 Windows 7 或 10 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用任务计划程序重新启动 Windows 服务

尝试使用 Python 3.6.2 在 Windows 7 上创建虚拟环境

windows和Linux下定时启动或关闭服务

在 Windows 7 中获取/创建 Outlook 应用程序

在 Windows 7 用户登录之前运行批处理文件以启动 VLC Web 界面

如何用批处理文件(.bat)停止或启动windows的服务 ?