【问题标题】:Disable windows restart/shutdown during software install在软件安装期间禁用 Windows 重新启动/关闭
【发布时间】:2020-05-08 09:55:30
【问题描述】:

我正在开发一个自动更新工具。架构如下: 我有一个 GUI 应用程序和一个在它们之间进行通信的服务;安装 gui 应用程序以在每次操作系统启动时运行,服务也是如此。

当 GUI 应用程序发现有新的更新可用时,它会下载更新并要求服务以静默模式运行它(我为此任务使用了一个服务,因为安装程序需要以管理员权限运行而无需用户交互)。此时安装程序以静默模式运行(请记住这是服务的子项,因此它继承服务运行上下文)(作为我使用 nsis 的安装程序系统)并执行当前应用程序的卸载(它删除GUI 应用程序及其二进制文件,停止服务/终止服务,因此基本上它会终止其父亲,从系统中卸载服务并删除其二进制文件)并安装包含新 gui 应用程序和新服务的新软件包。 我想知道在此卸载/安装过程中是否可以避免系统关闭(因为在此过程中关闭可能会损坏应用程序文件和应用程序状态)。

我已阅读有关 WM_QUERYENDSESSION 和 ShutdownBlockReasonCreate 的信息,但由于我的安装程序作为服务的子项运行,因此它在会话 0 中运行,如此处所述https://devblogs.microsoft.com/oldnewthing/20151002-00/?p=91461 我无法使用它们。我也不能使用 SERVICE_ACCEPT_PRESHUTDOWN 标志,因为安装程序会更新服务(因此该标志在服务删除后将不起作用)。

您能建议解决上述问题的方法吗?如果当前架构没有选择,我也愿意重新审视我的软件架构。

谢谢

【问题讨论】:

    标签: windows windows-services installation nsis silent-installer


    【解决方案1】:

    我能想到 3 种不同的可能解决方案:

    • 使用签名的 MSI 安装程序和 UAC patching。初始安装需要提升,但非管理员可以安装签名补丁。

    • 使用版本化服务;将其安装在基于版本命名的子文件夹中。旧服务必须将新服务作为正常进程运行,并且正常进程会停止旧服务,更新服务二进制路径,然后启动服务作为更新过程的第一步。这应该允许您使用SERVICE_ACCEPT_PRE­SHUTDOWN

    • 使用该服务通过WTSQueryUserToken + CreateProcessAsUser 在交互式桌面会话上启动一个帮助进程。这个进程应该能够阻止关机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多