Windows sc是否以任何方式订购查询?

Windows sc是否以任何方式订购查询?,windows,service,scripting,nsis,Windows,Service,Scripting,Nsis,正在使用NSIS安装程序管理服务。卸载时,这些服务将使用net stop停止,因为它是同步的,然后使用sc delete标记为删除,因为它们不必立即/同步删除 现在我想知道安装过程。通话顺序如下: 净停止服务1 净停止服务2 sc-config-service1 dependency=dependency1 sc配置服务2 dependency=dependency2 sc启动服务1 sc启动服务2 传递给sc的查询是否有内在顺序?它们是否按照调用的顺序完成了sc(我假设不是)?他们是否被委派到

正在使用NSIS安装程序管理服务。卸载时,这些服务将使用
net stop
停止,因为它是同步的,然后使用
sc delete
标记为删除,因为它们不必立即/同步删除

现在我想知道安装过程。通话顺序如下:

  • 净停止服务1
  • 净停止服务2
  • sc-config-service1 dependency=dependency1
  • sc配置服务2 dependency=dependency2
  • sc启动服务1
  • sc启动服务2
  • 传递给
    sc
    的查询是否有内在顺序?它们是否按照调用的顺序完成了
    sc
    (我假设不是)?他们是否被委派到各自的服务并在那里排队(这是我所希望的),例如
    service1
    service2
    是否先停止并配置是不明确的,但
    sc-config
    sc-start
    顺序不明确?订单是否完全模棱两可

    此外,我很想知道混合
    net
    sc
    调用时会发生什么。假定以下顺序:

  • net-stop服务
  • sc配置服务
  • 净启动服务
  • 假设服务可能会停止,然后在任何配置发生之前启动,这是否合理

    一般的问题是,如何通过连接的
    sc
    /
    net
    调用确保正确的服务设置。所需订单:

  • 停止服务(系统上可能存在也可能不存在)
  • 创建服务/配置服务
  • 启动服务

  • 卸载不那么紧迫,因为停止服务并将其标记为删除就足够了。

    混合
    sc
    net
    调用不应该是问题,因为是SCM(服务控制管理器)进程控制服务,其他应用程序只要求SCM执行特定操作

    对于
    ChangeServiceConfig
    API函数,它声明:

    如果为正在运行的服务更改了配置(lpDisplayName除外),则这些更改在服务停止之前不会生效

    这使我相信安装程序可以使用以下顺序:

    安装/配置-->停止(同步)-->启动


    执行“停止-->配置-->启动”总是会出现争用条件问题,因为另一个进程可能会在错误的时间触发服务启动

    我想这一切都取决于SCM是否一次处理多个查询。如果SCM保留处理Arriving查询的顺序,则stop->config->start和config->start->stop会产生相同的结果。否则,如果没有这样的保证,那么stop->config->start、not config->stop->start似乎都不能确保服务以更新的配置启动。嗯。不过,我还是想给你投票,因为这给了我一些见解。作为一个小的更新,我通过脚本运行了
    net start
    net stop
    sc config
    的各种顺序,有趣的是,到目前为止,每次都保持着顺序。启动和停止不是即时操作,内部有额外的状态,如启动和停止。“stop,config,start”可能变成“stop,start(由无关的第三方)、config,start”,然后新的配置就不受尊重了。在我的情况下,没有第三方,但我同意,config,stop-start显然是更安全的变体。谢谢NSIS wiki还有服务插件和宏,您可以使用它们来代替调用sc.exe。