【问题标题】:How to install a service with the delayed-auto startup type in Windows XP如何在 Windows XP 中安装延迟自动启动类型的服务
【发布时间】:2016-06-20 01:50:17
【问题描述】:

我的安装程序在 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 的服务吗?如果不能,那么还有哪些替代方案?

【问题讨论】:

    标签: service windows-services windows-xp inno-setup


    【解决方案1】:

    delayed-auto 启动类型并非旨在解决服务之间的依赖关系。如果您依赖的服务也有delayed-auto 启动类型怎么办? delayed-auto 启动类型旨在通过延迟非必要服务来加速计算机启动。

    What does “delayed start” do in startup type for a Windows service?


    要设置服务之间的依赖关系,请使用depend= 选项。

    sc.exe create Example start= delayed-auto binPath= "..." depend= service1/service2/service3
    

    如果您仍想在 Windows Vista 和更新版本(推荐)上使用 delayed-auto,只需创建两个 [Run] 条目,一个用于 Windows XP,一个用于 Windows Vista (Windows version 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
    

    另见Execute different command in Inno Setup Run section based on Windows version


    一个更好但更复杂的解决方案是使用scripted constant。它减少了代码重复。

    【讨论】:

    • 但是如果我不知道我的依赖项是什么。不同操作系统上的依赖关系可以不同吗?是否有任何我应该为常规 Web 服务包含的基本依赖项。
    • 我的可执行文件使用 SNMP 扫描网络设备并使用 HTTP/HTTPS 将它们发送到服务器。你可以在这里下载它maprinter.com/downloads/Maprinter.exe
    • 那么为什么需要等待依赖呢?如果程序扫描设备列表几次失败,因为还没有网络连接(我假设这是依赖项),它会很快自行修复。
    • 即使在 try 和 except 子句中,服务也会崩溃
    • 大多数“互联网/网络”服务似乎依赖于“远程过程调用 (RPC)”服务 (depend= RpcSs)。试试看。此服务的名称在所有版本的 Windows 上都相同。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多