从可执行文件创建Windows服务

是否有任何快速的方法,给定一个可执行文件,创建一个Windows服务,当启动时,启动它?

888109 次浏览

要从可执行文件创建Windows服务,可以使用sc.exe:

sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"

实际的exe路径周围必须有引号,binPath=路径后面必须有空格。

有关sc命令的更多信息可以在Microsoft KB251192中找到

注意,它不适用于任何可执行文件:可执行文件必须是Windows服务(即实现ServiceMain)。当注册一个非服务可执行文件为服务时,你会在试图启动服务时得到以下错误:

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

有一些工具可以从任意的、非服务的可执行文件中创建Windows服务,请参阅其他答案以获得此类工具的示例。

使用NSSM(非吸吮服务经理)将. bat或任何. exe文件作为服务运行。

< a href = " http://nssm。cc / noreferrer“rel = > http://nssm.cc/ < / >

  • 步骤1:下载NSSM
  • 步骤2:使用nssm.exe install [serviceName]安装你的服务
  • 步骤3:这将打开一个GUI,你将使用它来定位你的可执行文件

延伸(凯文·唐)回答。

步骤1:下载&解压缩nssm-2.24.zip

步骤2:从命令行类型:

C:\> nssm.exe install [servicename]

它将打开如下所示的GUI(示例是UT2003服务器),然后简单地浏览到:yourapplication.exe

enter image description here

有关https://nssm.cc/usage的更多信息

许多现有的答案包括安装时的人工干预。这可能是一个容易出错的过程。如果您有许多可执行文件想要作为服务安装,那么您最不想做的事情就是在安装时手动执行它们。

针对上述场景,我创建了serman,这是一个命令行工具,用于将可执行文件作为服务安装。您所需要编写的(只编写一次)是一个简单的服务配置文件以及可执行文件。运行

serman install <path_to_config_file>

将安装服务。stdoutstderr都记录了日志。要了解更多信息,请查看项目网站

工作配置文件非常简单,如下所示。但它也有许多有用的特性,如下面的<env><persistent_env>

<service>
<id>hello</id>
<name>hello</name>
<description>This service runs the hello application</description>


<executable>node.exe</executable>


<!--
\{\{dir}} will be expanded to the containing directory of your
config file, which is normally where your executable locates
-->
<arguments>"\{\{dir}}\hello.js"</arguments>


<logmode>rotate</logmode>


<!-- OPTIONAL FEATURE:
NODE_ENV=production will be an environment variable
available to your application, but not visible outside
of your application
-->
<env name="NODE_ENV" value="production"/>


<!-- OPTIONAL FEATURE:
FOO_SERVICE_PORT=8989 will be persisted as an environment
variable to the system.
-->
<persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>

这些额外的东西证明是有用的。需要作为管理员来执行

sc create  <service_name> binpath= "<binary_path>"
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

如果您的服务名称有空格,请用“quotes"”括起来。

我已经测试了一个很好的产品:AlwaysUp。不是免费的,但是有30天的试用期,所以你可以试一试。

您可以查看我的小型免费实用程序的服务创建\编辑\删除操作。下面是创建示例:

执行服务->修改->创建

enter image description here

可执行文件(谷歌驱动器):(下载)

源代码:(下载)

博客文章:(BlogLink)

服务编辑器类:WinServiceUtils.cs

Sergii Pozharov的回答相同,但使用PowerShell cmdlet:

New-Service -Name "MyService" -BinaryPathName "C:\Path\to\myservice.exe"

参见New-Service获取更多自定义。

这只适用于已经实现Windows服务API的可执行文件。

也许你所有的答案都更好,但是——只是为了完整地选择选项——我想提醒一下多年来使用的旧的、类似的方法:

SrvAny(由InstSrv安装)

如下所示: https://learn.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service < / p >

几年前,我创建了跨平台的服务管理器软件,这样我就可以在Windows、Mac和Linux操作系统上启动PHP和其他脚本语言作为系统服务:

https://github.com/cubiclesoft/service-manager

Service Manager是一组预编译的二进制文件,使用几乎相同的命令行选项(源代码也可用)在目标操作系统上安装和管理系统服务。每个平台确实有细微的差异,但核心功能大多是标准化的。

如果子进程死亡,服务管理器将自动重新启动它。

使用Service Manager启动的进程应该定期观察两个通知文件,以处理重新启动和重新加载请求,但它们不一定要这样做。如果子进程没有及时响应受控的重新启动/重新加载请求,Service Manager将强制重新启动子进程。

我有另一种方法,使用名为Topshelf的开源库。 我在一个c#项目中使用了它,但是它可能在不同的编程语言中可用 这里有一个视频解释了如何使用它。 https://www.youtube.com/watch?v=y64L-3HKuP0 < / p >

对很多人来说,这个问题的关键是你不能将任何旧的.exe作为服务安装,除非你使用Tomeg使用的旧方法。我找不到让它工作所需的windows nt工具包。

我被困在角落里,这是我的出路。