使用WiX进行MajorUpgrade后无法启动Windows服务

时间:2019-03-10 04:20:29

标签: c++ wix windows-services

我有一个非常简单的WiX项目。没有什么花哨。尝试对现有安装执行MajorUpgrade时,它无法启动服务,因此不可避免地回滚到以前的版本并正常启动服务。我已经删除了Start="install"并成功手动启动了该应用程序,因此我知道这不是依赖性问题。

我进行了无休止的搜索,没有找到解决问题的答案。

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallFinalize" />

我的服务安装:

<ServiceInstall
        Id="ServiceInstaller"
        Type="ownProcess"
        Name="LsdnService"
        DisplayName="Lsdn Service"
        Description="Placeholder for now."
        Start="auto"
        Account="[SERVICEACCOUNT]"
        Password="[SERVICEPASSWORD]"
        ErrorControl="normal"/>
<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="LsdnService" Wait="yes" />

我将MSI日志转储到文件中,并收到此错误,但是它非常模糊。

MSI (s) (18:48) [22:41:27:349]: Note: 1: 2205 2:  3: Error 
MSI (s) (18:48) [22:41:27:349]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1920 

在安装过程中对注册表进行了一些修改。安装程序将尝试从注册表中读取并继承已经存在的值。

<Property Id="LSDNADDRESS" Value="127.0.0.1">
  <RegistrySearch Id="LsdnAddressProperty" Root="HKLM" Key="$(var.RegistryKey)" Name="LsdnAddress" Type="raw" />
</Property>
<Property Id="LSDNPORT" Value="9920">
  <RegistrySearch Id="LsdnPortProperty" Root="HKLM" Key="$(var.RegistryKey)" Name="LsdnPort" Type="raw" />
</Property>
<Property Id="LSDNKEY" Value="6f380b07-0b54-4904-8303-95d1ec45d453">
  <RegistrySearch Id="LsdnKeyProperty" Root="HKLM" Key="$(var.RegistryKey)" Name="LsdnKey" Type="raw" />
</Property>

2 个答案:

答案 0 :(得分:1)

  

调试结果 :经过大量的调试(由原始发布者-OP进行),结果证明这是此处描述的MSI已知问题:   https://wix-users.narkive.com/EMfQPDrM/a-bug-get-reg-sz-when-using-type-integer。很好的搜索工作。

     

DWORD中有什么? (显然是 REG_SZ ):本质上,MSI可以“转换”一个 {通过 DWORD 找到的{1}} 值   升级过程中对格式化字符串- RegistrySearch 的操作   安装(也可能会涉及更多)。这导致服务   预期 REG_SZ 的值会在专业期间启动时下降   升级。 一个非常奇怪的错误

     

解决方法 :通过使服务代码既可以读取 DWORD ,又可以读取服务代码,可以尝试“解决”此问题。 DWORD 。   这比在计算机上解决问题提供了更可靠的解决方案。   自定义操作,因为只要代码在其中,它就是“永久性”修复   那里(代码的存在提醒其他开发人员有关   问题)。还是只使用 REG_SZ


  

快速检查 :显然,请检查服务密码并登录。任何东西   事件查看器 Windows键 +点击 R + REG_SZ + 输入How to use the Event Viewer to troubleshoot problems with a Windows Service。也许您可以尝试在文件夹之前和之后进行文件夹差异,看看您是否在其中发现了意外情况   配置文件?自然会有很多二进制   差异,但请检查文本文件(还可以编码)。检查 MSI日志文件   再次搜索 eventvwr.msc ,如下所述:Tips For Checking MSI Log Files "value 3"


  

服务专家 Windows Services Frequently Asked Questions (FAQ)。内容似乎是最新的-至少以面值计。   这些家伙自称是服务专家。我不知道他们是谁   是。

     

查看上方链接中的“错误”部分。这里有一些   提取物:

     

通用检查清单 :如果以上都不做任何事情,请尝试以下 Manually copy the new files in place and attempt to start the service via the services.msc applet (只是开始调试的想法) ):


通用调试 :引入了一些通用调试方法。


一些其他链接

答案 1 :(得分:1)

这肯定是一个依赖性问题。例如,只有在StartServices之后的提交阶段才将GAC / WinSXS文件安装到GAC中。

我将把Start =“ Install”留在其中,当它位于无法启动的提示时,请检查计算机的状态并手动调试服务启动。我敢打赌,您会发现缺少的东西。