如何在Windows XP中安装延迟自启动类型的服务

3
我的安装程序使用以下命令在Inno Setup中创建服务:
Filename: {sys}\sc.exe; Check: IsAdminLoggedOn; Parameters: "create Example start= delayed-auto binPath= ""{app}\Example.exe"""; Flags: runhidden

这行代码在除了Windows XP之外的所有Windows系统上都可以使用,因为Windows XP不支持delayed-auto启动类型。
我需要使用delayed-auto启动类型有两个原因:

  1. 我的服务需要始终在后台运行,无需用户干预,这意味着服务必须在启动时自动启动。
  2. 我的服务依赖于其他基本的Windows服务,如果没有它们就无法运行,因此我使用delayed-auto启动类型,在所有基本服务启动后再启动。

那么我能否在Windows XP上创建类似于delayed-auto的启动类型的服务?如果不能,那么有什么替代方案吗?

2个回答

6
延迟自启动类型并不旨在解决服务之间的依赖关系。如果您所依赖的服务也具有延迟自启动类型,那该怎么办?延迟自启动类型旨在通过延迟非必要服务来加快计算机启动速度。
请参见什么是Windows服务的“延迟启动”?
要设置服务之间的依赖关系,请使用depend=选项。
sc.exe create Example start= delayed-auto binPath= "..." depend= service1/service2/service3

如果您仍想在Windows Vista及更高版本中使用delayed-auto(这是推荐的方式),只需创建两个[Run]条目,一个用于Windows XP,另一个用于Windows Vista(Windows版本 6.0及更高版本)。

; Delayed automatic start on Vista and newer
Filename: {sys}\sc.exe; Check: IsAdminLoggedOn; \
    Parameters: "create Example start= delayed-auto binPath= ""{app}\Example.exe"" depend= service1/service2/service3"; \
    Flags: runhidden; MinVersion: 6.0

; Automatic start on XP
Filename: {sys}\sc.exe; Check: IsAdminLoggedOn; \
    Parameters: "create Example start= auto binPath= ""{app}\Example.exe"" depend= service1/service2/service3"; \
    Flags: runhidden; OnlyBelowVersion: 6.0

另请参见根据Windows版本在Inno Setup运行部分执行不同命令


更好的解决方案是使用脚本常量,虽然有点复杂,但可以减少代码重复。


我的可执行文件使用SNMP扫描网络设备,并使用HTTP / HTTPS将它们发送到服务器。您可以在此处下载http://maprinter.com/downloads/Maprinter.exe - yuval
那么为什么需要等待依赖项呢?如果程序在扫描设备列表时失败了几次,因为尚未建立网络连接(我假设这是依赖项),它很快就会自行修复。 - Martin Prikryl
即使在try和except语句中,服务也会崩溃。 - yuval
大多数“互联网/网络”服务似乎依赖于“远程过程调用(RPC)”服务(depend= RpcSs)。尝试一下。此服务的名称在所有版本的Windows上都相同。 - Martin Prikryl
启动类型为“自动”的问题在于有时会在启动时崩溃,有时则不会,因此我无法确定这是否是我所需的唯一依赖项。有更好的方法来确定我的依赖关系吗? - yuval
显示剩余2条评论

1
尝试创建一个计划任务,当系统启动时启动。该计划任务可以依赖于网络连接的存在。如果这对您不可用,您还可以使用命令行脚本针对网络设备执行ping并在启动您创建的“手动”启动服务之前检查响应。这应该避免由于资源不可用而导致的崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接