WiX 3.0抛出错误217,同时由持续集成执行

这是我们在 Windows 2008上运行 (从 维克斯2.0迁移到 WiX 3.0之后)时自动构建套件抛出的错误:

执行 ICE 动作‘ ICE01’时出错。这种 ICE 故障最常见的原因是注册不正确的脚本引擎。有关详细信息以及如何解决此问题,请参阅 http://wix.sourceforge.net/faq.html#Error217。外部用户界面消息记录器没有预料到以下字符串格式: “无法访问 Windows Installer 服务。如果 Windows Installer 没有正确安装,就会出现这种情况。联系你的支持人员寻求帮助。”.在 light.exe (0,0)中

此外,这些错误显示在事件日志中:

MSIInstaller: 连接到服务器失败。错误: 0x80070005 产品: [ ProductName ]——错误1719。无法访问 Windows Installer 服务。如果 Windows Installer 没有正确安装,就会出现这种情况。联系你的支持人员寻求帮助。

直觉告诉我:

  • VBScript JScript在 admin 下注册。
  • 集成服务具有桌面交互和所有文件的权限
  • 构建成功时,由另一个用户或甚至作为集成帐户登录的用户(通过 RDP)在同一台计算机上手动执行

到目前为止我一点主意都没有。

如何解决这个问题,同时保持 ICE 验证?

25901 次浏览

I have some suggestions.

  • Try updating the Microsoft Installer version on the build server
  • Make sure you use the newest release of WiX 3.0, since it's 3.0 release stable now.
  • If all else fails, try running the build service under a specific build user who you can fiddle with permissions for...

End of the story:

After fiddling with the permissions of the integration account, DCOM, service activation, etc. without any luck, I finally simply disabled ICE validation in the continuous integration build, while still keeping it in the local build.

To disable ICE validation you can set SuppressValidation to true in the .wixproj file:

    <PropertyGroup>
<SuppressValidation>true</SuppressValidation>
</PropertyGroup>

Or pass the -sval command line option to light.exe.

From http://wix.sourceforge.net/faq.html#Error217:

In WiX v3, Light automatically runs validation-- Windows Installer Internal Consistency Evaluators (ICEs) --after every successful build. Validation is a great way to catch common authoring errors that can lead to service problems, which is why it’s now run by default. Unfortunately, there’s a common issue that occurs on Windows Vista and Windows Server 2008 that can cause ICEs to fail. For details on the cause and how to fix it, see Heath Stewart's Blog and Aaron Stebner's WebLog.

Adding the TFS build controller account to local admin group and restarting the windows service did the job for me.

I found the root cause. I tried everything I found, including custom validator extension similar to one posted in Re: [WiX-users] light.exe failed randomly when running ICEs..

It's not a concurrency issue as suggested in various threads. It's caused by a too large Process Environment Block (PEB).

It turns out Windows Installer can’t handle a process environment block larger than 32 kB. In my environment, due to number of variables set by the build system and their size (for example, PATH variable containing multiple duplicated values), PEB was about 34 kB.

Interestingly, per Environment Variables, Windows XP and 2003 had a hard limit of PEB set to 32 kilobytes. That would probably cause an easy-to-catch build break in an earlier phase of the build. Newer Windows' doesn’t have such limit, but I guess that Windows Installer developers limited their internal environment buffers to 32 kB and fail gracefully when the value is exceeded.

The problem can be easily reproduced:

  • Create a .bat file which sets environment variables which size exceeds 32 kB. For example, it can be 32 lines of set Variable<number>=<text longer than 1024 characters>
  • Launch cmd.exe
  • Execute the batch file you created
  • From the same cmd.exe window:
    • Try building the MSI package using WiX with ICE validation on OR
    • Run smoke.exe to validate your package OR
    • Simply run msiexec /i Package.msi
  • All the above commands will end up reporting Error 1719 - Windows Installer could not be accessed.

So, the solution is - review your build scripts and reduce number and size of environment variables so they all fit into 32 kB. You can easily verify the results by running:

set > environment.txt

The goal is to get file environment.txt smaller than ~30 kB.

The correct description (without a solution, except if adding the CruiseControl account into local administrators group can pass as a solution) of the problem:

Quote from WiX 3.5&;巡航控制出现错误LGHT0217:

ICE validation needs an interactive account or administrator privileges to be happy. See for example WiX Projects vs. TFS 2010 Team Build (2009-11-14) or Re: [WiX-users] Help with building patch (2009-11-20).

imagi is totally right! I could not believe this is the true answer. Supressing validation and making TFS user Administrator are not good solutions. Plus I could not find NT\Authority to add it to Administrators group and was totally stuck in this.

I got the same error on Windows Server 2012 Datacenter as Build Agent. To solve the problem :

  1. List item
  2. Go to Environment Variables on the build agent machine
  3. Create two System Variables
  4. "PF86" which is equal to "C:\Program Files (x86)"
  5. "PF" which is equal to "C:\Program Files"
  6. They are so short because I want to save characters.I made them without the final backslash because TEMP, TMP and others were made so and I decided to stick to MS standard for these variables.
  7. Edit PATH variable by substituting every "C:\Program Files (x86)" with %PF86% and every "C:\Program Files" with %PF%
  8. Close and build and enjoy!
  9. It worked for me. :)

UPDATE I found a better solution : Rapid Environment Editor will do all this and even more for you. Automatically.

I was getting same ICE error, but the problem turned to be corrupted Windows Installer Service. This solution worked for me: http://support.microsoft.com/kb/315353

  1. Log on to your computer as an administrator.
  2. Click Start, and then click Run.
  3. In the Open box, type cmd, and then click OK.
  4. At the command prompt, type msiexec.exe /unregister, and then press ENTER.
  5. Type msiexec /regserver, and then press ENTER.
  6. Restart Windows

Also, verify that the SYSTEM account has full control access permissions to the HKEY_CLASSES_ROOT hive in the Windows registry. In some cases, you may also have to add Administrator accounts.

I faced the same problem and did not like to suppress ICE validation. My setup: I used my own computer as a build agent on Visual Studio Online (VSO). My solution was to change the account used to run the service on my machine. Instead of using Network Service or Local Service I simply made the service log on with my own account which had all the necessary rights.

Go to your build machine and restart the Windows Installer service

None of the above suggestions worked for me, for me the anti-virus (mcafee) came into the picture and looks like it updated the vbscript.dll registry entry to a wrong DLL location. These are the things to keep in mind:

  1. Some of the WiX ICE validations are implemented using VBSCRIPT.
  2. So while compiling the MSI, the build server would need access to the c:\windows\system32\vbscript.dll.
  3. Chances are that somehow the user that runs your build lost access to this DLL.
  4. As mentioned in the above answers do look for the admin access/registry access and make sure your user has it.

Here are the steps that I took to fix the issue:

  1. Open cmd (run as admin) on the build agent machine.
  2. Run RegEdit
  3. Select the root, then click ctrl + f and Search for the following registry entry : {B54F3741-5B07-11cf-A4B0-00AA004A55E8}
  4. Look for the InprocServer32\Default Key

enter image description here

  1. On my build agent, the path was replaced with a mcafee DLL location. I updated the path back to c:\windows\system32\vbscript.dll
  2. Editing the registry entry was not easy, as it was a protected registry entry. I used the below link to get access permissions changed before I could edit the property: Edit protected registry entry

Once I updated the path, everything started working as usual.

My solution is similar to Vladimir's one. My CI user was admin of the computer.

But the following steps were mandatory to allow my jenkins build to succeed:

  • log in as CI user using rdp
  • open a dos command prompt
  • execute: %windir%\system32\msiexec.exe /unregister
  • execute: %windir%\system32\msiexec.exe /regserver

then i got a successfull job

I got this error from my Azure build agent running on-premises. My solution was to upgrade its user account from "Network Service" to "Local system account".