Windows 在少数机器上无法通过 msi 安装程序安装服务

Windows service fails to install through msi setup in few machines

我用 WiX 开发了一个 MSI 设置,其中包括一个 windows 表单应用程序,使用 c# .Net 2.0 框架和一个 windows 服务。当我 运行 安装程序时,它在所有 win 7 中安装成功,但在少数 win 7 和所有 win 8 机器中失败,因为在安装时尝试启动服务时显示权限错误 ("Product: mysetup -- Error 1920. Service 'service displayname' (servicename) failed to start. Verify that you have sufficient privileges to start system services.") .然后我在我的 windows 服务项目中创建了一个 App.config 文件,并根据这个 link 我写了以下行,它帮助安装程序安装到所有的 win 7 机器上,但没有祝任何 win 8 机器好运。

<runtime><generatePublisherEvidence enabled="false"/></runtime>

关于服务细节,我在我的服务里面写了方法OnStart和OnStop。它实际上在 windows 启动时启动 win 窗体 exe 文件。我在 ServiceInstaller 页面将 StartType 属性 设置为 Automatic,在 ServiceProcessInstaller 页面将 Account 设置为 LocalSystem。我还在 WiX 中编写了以下代码来安装我的服务。

<ServiceInstall Id="ServiceInstaller" Type="ownProcess" Name="*******" DisplayName="******" Description="****** description" Start="auto" Account="LocalSystem" ErrorControl="ignore" Vital="yes" />
<ServiceControl Id="ServiceInstallerControl" Start="install" Stop="uninstall" Remove="uninstall" Name="******" Wait="yes" />

目前,安装程序和 windows 服务已安装,运行在任何 win 7 机器上都正常,但在任何 win 8 和机器上都失败。 Windows 事件查看器不显示任何详细信息,但 "msi setup fails".

请注意,我还没有为我的应用程序添加任何 ClickOnce 或 Publisher 证书。如果这不是安装失败的原因,我打算稍后再做。我该如何解决这个问题或获取错误详细信息或以任何方式进行调试?请帮忙。

编辑:

PhilDW 的回答非常值得注意。我的服务尝试 运行 我的 win 表单应用程序(.exe 文件)没有显示为 GUI,但是它实际上与桌面交互并实现了我已经遵循并实现了这个 link .到目前为止,这在 win xp 和 win 7 上运行良好,只要用户登录,该服务就会从应用程序成功启动 win。不确定 win 8 或更高版本,希望此方法不会被 Microsoft Windows 出于任何安全目的在更高版本中弃用或阻止或禁止(我的意思是,这会发生吗?那么与交互的解决方案是什么通过 LocalSystem windows 服务的桌面)。

在 Morten Frederiksen 的回答之后,我做了以下事情。在一台 Win 8(32 位)电脑上,我检查了 Windows->Microsoft.Net->Framework 文件夹,其中包含 4.0 和 4.5,但没有 2.0/3.0/3.5,正如 Morten 所说的那样。现在,我的 win form 应用程序已经按照 Morten 的建议在其 App.config 文件中包含 supportedRuntime 条目,但安装失败。所以我添加了相同的内容,即

<configuration>
    <startup>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

在我的 windows 服务的 App.config 中(我认为这是不必要的)和重建后的 运行 MSI,但同样的事情发生了,安装回滚显示相同的权限错误消息。然后我尝试手动 运行 我的 win form 应用程序。 它显示消息 "The app requires .Net framework 3.5. Would you like to download and install .Net framework 3.5 (2.0 and 3.0 included)"。 我点击了 "OK",它成功下载并安装了框架和 运行 win form app .exe 文件。现在所有框架都已安装,我尝试重新安装我的 MSI,现在它已成功安装,服务与实际进行桌面交互的应用程序一起启动,现在成功了。

所以,Morten Frederiksen 的回答帮我解决了我的案子。现在很清楚,在我的情况下,缺少所需的框架导致 win form 应用程序失败,再次导致 windows 服务无法启动,进而导致 MSI 回滚安装。

我会查看几个方面,排名不分先后。我假设您的表单应用程序尝试显示 UI,以及其他一些假设。

您在服务启动中设置了 wait=yes。这会导致 Windows 等待服务正常启动,默认等待时间为 30 秒。这意味着该服务必须在 30 秒内退出 OnStart,以表明它实际上已经正常启动。如果由于正在发生的事情而出现延迟,您可能会发现时间问题可能会随机导致它在 30 秒内或不在 30 秒内完成。

第二个问题可能更严重。我不相信您可以从服务启动 Winforms 应用程序,原因与本地系统服务无法再与桌面交互的原因相同 - 它向用户桌面公开系统帐户以进行粉碎攻击。这可能在 Windows 8 中严格执行,因此 Winform 进程终止并对服务产生下游影响,具体取决于它的编码方式。这是相关的 https://msdn.microsoft.com/en-us/library/windows/desktop/ms683502(v=vs.85).aspx

最后,即使您可以与桌面交互,重新启动后也可能存在计时问题。如果您的服务启动并触发 Winforms 应用程序,那么这可能会在任何人登录之前发生,除非您的代码等待登录,因为服务 运行 一直没有交互式用户,所以您的服务正在启动试图访问不存在的桌面的 Winforms 应用程序。我不知道你有没有处理过这个领域。

我建议您安装 Winforms 应用程序并在“开始”->“启动程序”菜单中添加一个快捷方式,以便它在用户登录时启动。然后它可以与 运行ning 服务建立通信。

我猜你没有在 Windows 8 台电脑上安装 .NET 2.0/3.0/3.5。通过在 .config 文件中添加一些配置,您可以在仅安装了 .NET 4.0/4.5 的系统上启用 .NET 2.0 应用程序。

方法如下: https://msdn.microsoft.com/en-us/library/jj152935%28v=vs.110%29.aspx