使用批处理文件创建和启动 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 服务?的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 Python 3.6.2 在 Windows 7 上创建虚拟环境
在 Windows 7 中获取/创建 Outlook 应用程序