我开发了一个带有WiX的MSI设置,其中包括c#.Net 2.0框架中的Windows窗体应用程序和一个Windows服务。当我运行安装程序时,它在所有win 7中成功安装,但在少数win 7和所有win 8机器中失败,显示特权错误(“Product:mysetup - Error 1920.Service'service displayname'(servicename)failed开始。确认您有足够的权限启动系统服务。“)在安装时尝试启动服务。然后我在我的Windows服务项目中创建了一个App.config文件,根据这个link,我编写了以下代码,帮助设置安装到所有win 7机器中,直到现在,但是任何win 8机器都没有运气
<runtime><generatePublisherEvidence enabled="false"/></runtime>
关于服务细节,我在服务中编写了OnStart和OnStop方法。它实际上是在Windows启动时启动win form 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安装失败”
请注意,我尚未为我的应用添加任何ClickOnce或Publisher证书。我计划稍后再做,如果这不是安装失败的原因。我如何解决这个问题或获取错误详细信息或以任何方式调试?请帮忙。
编辑:
PhilDW的回答非常重要。我的服务尝试运行的win表单应用程序(.exe文件)不会显示为GUI但是它实际上与桌面交互并实现我已遵循并实现此link。到目前为止,这在win xp和win 7上工作正常,只要用户登录,该服务就会从app成功启动。不确定win 8或更高版本,希望这个方法不会因为任何安全目的而被高级版本的Microsoft Windows弃用或阻止或禁止(我的意思是,这会发生吗?那么通过LocalSystem windows与桌面交互的解决方案是什么?服务)。
在Morten Frederiksen的回答之后,我做了以下事情。在一台Win 8(32位)电脑上,我检查了Windows-&gt; Microsoft.Net-&gt; Framework文件夹,其中包含4.0和4.5但没有完全按照Morten所说的2.0 / 3.0 / 3.5。现在,我的win form应用程序已经按照Morten的建议在其App.config文件中包含supportedRuntime条目,但是安装没有运气。所以我加了同样的东西。
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
在我的Windows服务的App.config中(我认为这是不必要的)并在重建后运行MSI,但同样的事情发生,安装回滚显示相同的权限错误消息。然后我尝试手动运行我的win form应用程序。 它显示消息“应用程序需要.Net framework 3.5。您是否要下载并安装.Net framework 3.5(包含2.0和3.0)”。我点击“确定”,下载并安装框架并成功运行win form app .exe文件。现在已经安装了所有框架,我尝试重新安装我的MSI,现在它已成功安装,服务随着应用程序一起启动,该应用程序现在已成功完成桌面交互。
所以,Morten Frederiksen的回答帮助我解决了我的问题。现在很清楚,在我的情况下,缺少必要的框架导致win表单应用程序失败,这再次导致Windows服务无法启动,这反过来导致MSI安装的回滚。
答案 0 :(得分:1)
我有几个方面,没有特别的顺序。我假设您的表单应用尝试显示UI,以及其他一些假设。
您在服务启动时有wait = yes。这会导致Windows等待服务正常启动,默认等待时间为30秒。这意味着服务必须在30秒内退出OnStart,以表明它实际上已经开始正常。如果由于发生了什么而导致延迟,您可能会发现计时问题可能会导致它在30秒内完成。
第二个问题可能更严重。我不相信您可以从服务启动Winforms应用程序,原因与本地系统服务无法再与桌面交互相同 - 它会将系统帐户暴露给用户的桌面以进行破坏性攻击。这可能在Windows 8中严格执行,因此Winform进程会死,并对服务产生下游影响,具体取决于它的编码方式。这是相关的https://msdn.microsoft.com/en-us/library/windows/desktop/ms683502(v=vs.85).aspx
最后,即使您可以与桌面交互,重启后也会出现潜在的时间问题。如果你的服务启动并启动Winforms应用程序,那么这可能在任何人登录之前发生,除非你的代码等待登录,因为服务在没有交互式用户的情况下一直运行,所以你的服务正在启动Winforms试图访问不存在的桌面的应用程序。我不知道你是否处理过这个区域。
我建议你安装Winforms应用程序并在Start-&gt; Startup程序菜单中添加一个快捷方式,以便在用户登录时启动它。然后它可以与正在运行的服务建立通信。
答案 1 :(得分:1)
我的猜测是你没有在Windows 8 PC上安装.NET 2.0 / 3.0 / 3.5。通过在.config
文件中添加一些配置,您可以在仅安装了.NET 4.0 / 4.5的系统上启用.NET 2.0应用程序。
在这里&#39>如何: https://msdn.microsoft.com/en-us/library/jj152935%28v=vs.110%29.aspx