从可执行文件创建 Windows 服务

Posted

技术标签:

【中文标题】从可执行文件创建 Windows 服务【英文标题】:Create Windows service from executable 【发布时间】:2011-04-04 16:05:59 【问题描述】:

在给定一个可执行文件的情况下,有没有什么快速的方法可以创建一个 Windows 服务,该服务在启动时会启动它?

【问题讨论】:

Here 是微软关于如何实现这一点的说明。 【参考方案1】:

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

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

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

More information on the sc command can be found in Microsoft KB251192。

请注意,它不适用于任何可执行文件:可执行文件必须是 Windows 服务 (i.e. implement ServiceMain)。将非服务可执行文件注册为服务时,尝试启动服务时会出现以下错误:

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

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

【讨论】:

您(几乎可以肯定)必须以管理员身份运行命令提示符才能使该命令起作用 路径还需要是完全限定路径 - 我无法使用相对路径启动我的服务。 binpath= 之后的空格以及必须用双引号将可执行路径括起来是完全错误的,至少对于 Windows 10 而言。当且仅当路径包含特殊字符(如空格)时才需要引用.此外,大小写(小写/大写/混合大小写)在任何地方都无关紧要,在变量名中也是如此,displayname="my service" 是在创建服务以查看为第一行时传递命令行的另一个好东西(Name)在services.msc binPath= 后面的空格是我在 Windows 7 上需要的,但在 Windows 10 上不需要 正如这个答案所承认的,这仅适用于设计为 Windows 服务的 exe。【参考方案2】:

使用 NSSM(非 Sucking 服务管理器)将 .BAT 或任何 .EXE 文件作为服务运行。

http://nssm.cc/

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

【讨论】:

有史以来最好的服务经理。我什至设法让 PlexWatch 安装为使用 NSSM 的服务。 这套是永远的服务吗?每次windows启动服务都会启动吗?还有我怎么能在没有用户交互的情况下做到这一点?某种脚本或代码? 这太棒了,我希望我能接受这个答案而不是第一个,:-( 我可以在服务器上运行 Dropbox 作为服务。绝对是一个不吸吮的工具! exe 文件必须是 Windows 服务项目,才能使用 nssm 还是可以是普通的 exe 文件?,因为当我使用 nssm start [servicename] 时,它会显示类似的错误, windows 服务无法从命令提示符等运行。【参考方案3】:

扩展(Kevin Tong)答案。

第一步:下载并解压nssm-2.24.zip

第 2 步: 从命令行输入:

C:\&gt; nssm.exe install [servicename]

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

更多信息:https://nssm.cc/usage

【讨论】:

正确的语法nssm.exe install [serviceName]。此解决方案有效,但如果您有 GUI 应用程序,它将无法在 Win Serever2003 上运行。如果您以后想删除它,请使用nssm.exe remove [youservicename] 我假设对 nginx 的引用是因为那是您想要作为服务运行的特定程序?直到我在上面看到 hmd 的评论之前,我以为您试图通过暗示 nginx 是安装所需的依赖项或其他东西来提供帮助……但是在 GUI 中,您似乎没有安装 nginx,而是在安装 Unreal Tournament服务器?只是指出该示例不一致且可能具有误导性。一个简单的“假设你想将 nginx 安装为服务,那么它看起来像这样:”会有所帮助。 @flutefreak7 是的 nginx 没有必要并且具有误导性。该命令在没有它的情况下也可以工作。如果要从命令提示符提供服务名称,它是可选参数。 当我尝试使用 nssm 时,我的 Windows 窗体正在运行,但没有显示窗体...为什么? 它将您的应用程序作为 Windows 服务运行,大部分用于后端。也可能是它作为另一个 root / admin 用户名运行。你必须检查它。您还可以在此处查看更多信息:nssm.cc/usage【参考方案4】:

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

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

serman install <path_to_config_file>

将安装该服务。 stdoutstderr 都已记录。欲了解更多信息,请查看project website。

一个工作配置文件非常简单,如下所示。但它也有很多有用的功能,比如下面的&lt;env&gt;&lt;persistent_env&gt;

<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>

【讨论】:

【参考方案5】:

这些附加功能被证明是有用的.. 需要以 Administrator

的身份执行
sc create  <service_name> binpath= "<binary_path>"
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

与Sergii Pozharov's answer 相同,但使用 PowerShell cmdlet:

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

更多定制请见New-Service

这仅适用于已经实现 Windows Services API 的可执行文件。

【讨论】:

【参考方案8】:

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

转到服务 -> 修改 -> 创建

可执行文件(谷歌驱动器):[Download]

源码:[Download]

博文:[BlogLink]

服务编辑器类:WinServiceUtils.cs

【讨论】:

【参考方案9】:

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

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

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

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

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

【讨论】:

【参考方案10】:

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

SrvAny(由 InstSrv 安装)

如此处所述: https://docs.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service

【讨论】:

请注意,下载资源工具包的链接已被 Microsoft 删除。人们必须搜索其他非官方下载或在archive.org 中找到快照。另外,期待0个32位的可执行文件(有些16位也可以),64位二进制的状态未知,所以需要人们自己做测试。

以上是关于从可执行文件创建 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

将类从可执行文件导出到 dll

Apparmor:是不是可以从可执行文件中调用另一个可执行文件?

如何从可执行文件中提取数组?

使用 def 文件从可执行文件中导出函数

从可执行文件中找出编译优化标志

从可执行文件 (.exe) 中恢复 NodeJS 代码