在软件安装过程中禁用Windows重启关机。

问题描述 投票:0回答:1

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

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

我读过WM_QUERYENDSESSION和ShutdownBlockReasonCreate,但是由于我的安装程序是作为服务的子程序运行的,所以它是在session 0中运行的,所以就像这里说的那样。https:/devblogs.microsoft.comoldnewthing20151002-00?p=91461。 我不能使用它们。我也不能使用SERVICE_ACCEPT_PRESHUTDOWN标志,因为安装程序会更新服务(所以该标志在服务删除后没有效果)。

你能不能提出一个解决上面问题的方法?如果目前的架构没有办法,我也愿意重新审视我的软件架构。

谢谢你的建议

windows windows-services installer nsis silent-installer
1个回答
0
投票

我可以想到三种不同的解决方案。

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

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

  • 使用该服务在交互式桌面会话上启动一个帮助程序,并使用 WTSQueryUserToken + CreateProcessAsUser. 这个过程应该可以阻止关机。

© www.soinside.com 2019 - 2024. All rights reserved.