【问题标题】:How can I block another process from rebooting Windows?如何阻止另一个进程重新启动 Windows?
【发布时间】:2014-09-26 13:55:20
【问题描述】:

我有一个 Windows 安装引导程序,setup.exe。它用于下载和安装 Microsoft 必备软件(.NET Framework 3.5、Microsoft Visual Studio Tools for Office Runtime (VSTO) 等)。 VSTO 是有问题的,因为在某些主机 Windows 操作系统版本上它会强制重启。这可能会导致客户非常沮丧,因为他们没有时间保存他们的工作。因此,我需要停止这种行为。

在 C# 中,有什么方法可以阻止另一个进程重新启动 Windows?

我发现解决此问题的唯一有用方法是 P/Invoking ShutdownBlockReasonCreate。但这不够透明,因为此方法会阻止特定进程的关闭,而不是与导致关闭的进程相同的进程,因此很烦人,因为向用户显示了操作系统关闭屏幕,并且在该屏幕中正在运行的进程列表,阻止关机的进程,以及取消或继续关机的按钮。我希望有一种更透明的方式来处理这个问题。

编辑:正如另一个 Alex 提到的,msiexec 支持 [/norestart][/promptrestart][/forcerestart]。但是,在我的 WiX 项目中,我不知道如何将命令行参数传递给安装这些先决条件的 MSI。我的引导程序setup.exe 生成如下:

<Target Name="AfterBuild">
  <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <BootstrapperFile Include="Microsoft.Net.Framework.3.5.SP1">
      <ProductName>.NET Framework 3.5 SP1</ProductName>
    </BootstrapperFile>
    <BootstrapperFile Include="Microsoft.VSTORuntime.4.0">
      <ProductName>Microsoft Visual Studio 2010 Tools for Office Runtime (x86 and x64)</ProductName>
    </BootstrapperFile>
  </ItemGroup>
  </BootstrapperFile>
  <GenerateBootstrapper ApplicationFile="$(TargetFileName)" ApplicationName="My Application" BootstrapperItems="@(BootstrapperFile)" ComponentsLocation="HomeSite" CopyComponents="False" OutputPath="$(OutputPath)" Path="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\BootStrapper" ApplicationRequiresElevation="True" Culture="en-US" Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' " />
</Target>

以上内容位于我的 .wixproj 文件中。

【问题讨论】:

  • 在您预期的示例中,该消息将指示已启动关闭的进程现在正在阻止关闭。这更令人困惑。
  • 我会说这是安装程序的问题,应该在那里修复。它应该让用户选择是现在还是以后重新启动,而不是立即重新启动。
  • @ThomasW。是的,这就是为什么它绝对不是处理这种情况的最透明方式!真正的问题是,由于某种原因,VSTO 安装程序强制重启,即微软的安装程序,其中的逻辑超出了我的控制,我需要阻止它强制重启!
  • msiexec 支持 [/norestart][/promptrestart][/forcerestart]
  • 在这种情况下可能无法使用shutdown -a 中止关机,因为关机顺序没有时间限制。

标签: c# .net windows winapi bootstrapper


【解决方案1】:

这似乎是 ClickOnce 部署,而不是 WiX 引导程序 (Burn) 应用程序。您发布的 xml 看起来像是来自 .csproj 文件,而不是 .wixproj。看看以下链接是否有帮助。

【讨论】:

  • 不,我发布的 XML 肯定是在 .wixproj 文件中。
  • 您的 WiX 包/捆绑 xml 是什么样的?
  • 在 Product.wxs 中,它的 标签后跟 标签,没有 的标签。在产品下我们有:
  • 我想您可能正在尝试将 Microsoft Bootstrapper 与 WiX 设置项目结合起来。此答案中的链接可以帮助您避免重新启动。或者,您可以考虑制作一个 WiX 引导程序包 (wixtoolset.org/documentation/manual/v3/bundle),它可以让您自定义在引导程序中安装的每个组件的命令行。
  • 我认为你是对的。谢谢,将考虑使用 WiX 引导程序包而不是 Microsoft 引导程序。
猜你喜欢
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2017-06-01
  • 2012-10-27
相关资源
最近更新 更多