WiX 在 Windows 更新问题的 XP 机器上表现不佳
Posted
技术标签:
【中文标题】WiX 在 Windows 更新问题的 XP 机器上表现不佳【英文标题】:WiX behaving badly on XP machine with windows update issues 【发布时间】:2018-09-06 16:26:30 【问题描述】:我的 WiX 包在特定的 XP 机器 (x86) 上表现非常糟糕。在“初始化”阶段(在运行任何捆绑的安装程序之前),它会停止六分钟。从日志看来,这极有可能是由于机器上的 Windows 更新状态不佳:
[090C:0FC0][2018-03-27T19:31:17]i358: Pausing automatic updates.
[090C:0FC0][2018-03-27T19:37:23]w308: Automatic updates could not be paused due to error: 0x80080005. Continuing...
[090C:0FC0][2018-03-27T19:37:23]i360: Creating a system restore point.
我正在使用 WiX v3.10 制作捆绑包。我可以从谷歌搜索中找到非常相似的情况,但解决方案总是围绕更新目标机器。无论如何,我都需要此安装程序按预期工作。当我在同一台机器上测试常规 msi 时,它运行良好。
有什么办法可以缓解这个问题吗?例如。我可以阻止 WiX 捆绑包尝试暂停 Windows 更新或类似的东西吗?安装程序甚至不通知问题所在这一事实非常有问题,任何用户都可能会感到困惑。
这个 WiX 安装程序的重点是使安装包可移植且简单,但实际上这似乎比 msi 更不便携...
更新:还尝试使用 WiX 3.11 构建捆绑包,但遇到了同样的问题。虽然现在它会产生实际错误而不是安装,但我认为这是一种改进。
【问题讨论】:
重复***.com/questions/44197835/… 看起来我构建的包很糟糕。我用 WiX 3.10 重建了所有东西,超时后它不再匆忙完成安装。由于 Windows 更新问题,它仍会暂停 6 分钟,但这是可以接受的,因为它不会危及安装(与之前所做的不同)。我已更新问题以反映这一点。 XP?哎呀。我肯定会告诉客户支持是尽力而为,并且基本上只在具有功能 Windows 更新的完全修补的 XP 上进行了测试。 我几乎确信这是恶意软件 - 很抱歉。不过希望不会。请在下面查看我的更新答案。我想我找到了挂起的 COM 调用,但我想这并没有太大帮助。 【参考方案1】:更新:查看 WiX 源代码后,看起来 WiX 的刻录功能正在调用 Microsoft.Update.AutoUpdate
(%SystemRoot%\System32\usoapi.dll
- %SystemRoot%\SysWOW64\wuapi.dll
) 和这里的一些其他 COM 对象和那里。
查看底部(屏幕截图)以获取热门 COM 提示,以快速了解不同 COM 对象模型。
一定是这个 AutoUpdate 调用挂起,导致了与this blog 中描述的内容一致的超时。我相信你可以通过在the elevation.cpp WiX Burn source file(Github 链接)中搜索hr = WuaPauseAutomaticUpdates();
找到确切的源代码位置。对 COM 对象的实际调用位于 wuautil.cpp。
我对@987654324@ 不熟悉,但我想您可以尝试在测试VBScript 中调用Pause
函数,以查看您在问题系统上遇到的错误类型(如果有的话)。除了锁定问题系统之外,我看不到您将如何获得任何东西,所以也许先在您的主机上尝试一下? 这显然需要您自担风险。我假设重新启动或调用Resume
将正常继续该过程。我还在 C++ 代码中看到了对 SystemInformation.RebootRequired
的调用,我也将其添加到了 VBScript:
Set autoupdate = CreateObject("Microsoft.Update.AutoUpdate")
autoupdate.Pause()
MsgBox Err.Number & " " & Err.Description
Set sys = CreateObject("Microsoft.Update.SystemInfo")
MsgBox sys.RebootRequired
' autoupdate.Resume() ' Enable to resume AutoUpdate
Set sys = Nothing
Set autoupdate = Nothing
让我们面对现实吧:您的 XP 机器上的 Windows 更新已损坏 - 不是吗?也许 WiX 家伙可以添加更短的超时?我不确定哪个更好 - 1)
缩短超时,2)
删除整个通话或 3)
只是轰炸告诉用户 Windows 更新已损坏?坦率地说,后者可能会提醒用户注意一些非常严重的事情(通常是恶意软件)。
更新:正如您自己所说,Windows 更新几乎可以肯定在这台特定的机器上被破坏了。我会尝试下面建议的 MSI 属性进行测试,然后尝试zap Windows Update as suggested here(与下面相同的链接)(techical)。
但是等一下,在把时间浪费在其他事情上之前,也许要进行一次恶意软件检查?
Maybe try this free Sysinternals tool?使用近 70 个扫描引擎通过哈希检查所有正在运行的进程(尽管没有启发式)。启动所有你得到的(只检查正在运行的进程) 转到File
=> Show Details for All Processes
然后提升以扫描系统进程。现在单击“系统”以扫描驱动程序,例如(*.sys 文件)。
通常是让系统管理员同意为每个人重建有问题的机器的好方法。突然间,您从“部署问题”变成了“机器特定问题”——这超出了您的想象。 GIGO 问题。
顺便说一句,问题的格式和措辞都很好。仅供参考:Sysinternals。
解决方法?
我从未见过这种情况,但我看到一些 MSI 文件在安装时突然暂停很长时间,而在几分钟前的测试安装期间它们会快速安装。
我的猜测是,这可能与系统还原和在某些“间隔”创建还原点有关。我不确定使用什么算法来确定何时创建和不创建这样的还原点,但我多年前就加快 MSI 安装的问题写了一个答案:How can I speed up MSI package install and uninstall?
正如您将看到的,您可以通过设置涉及属性MSIFASTINSTALL 的适当命令行来禁用为您的设置创建还原点(以及一些其他调整 - 请阅读链接的 serverfault.com 答案)。我会试试这个,看看你的设置是否停止锁定/挂起。
原因?
来自网络的一些点击:
难道 Windows 更新也尝试在您的 MSI 程序包的同时创建一个还原点? Setup hang when trying to disable windows updates (PhilDW) Could it be that the Windows Update feature is corrupted? 类似问题:WiX Toolset installs VC++ redistributable (x86) 2015 too slowly我会首先尝试上面提到的作为“解决方法”的 MSI 属性,如果这不起作用,我会尝试查看 fixing Windows Update 是否为在上面的链接中解释了作品。至关重要的是,我还会让 Windows Update 在再次运行您的捆绑包之前完成其安装所有可用更新的任务。
热点提示 (COM)
我不喜欢推荐商业工具,但有时我们都需要一些速成技巧和速成 - 这就是这是关于。获取VbsEdit 并使用其轻量级对象浏览器 快速查看任何COM 对象模型的详细信息。只需执行CreateObject
,您将立即在应用程序窗口右侧的对象浏览器中看到对象模型(View => Object Browser
,如果它不存在)。
只需输入如下内容:
Set installer = CreateObject("WindowsInstaller.Installer")
当我需要处理遗留的 COM 内容并且 Visual Studio 非常缓慢时,我发现这可以节省时间。我只有 VbsEdit 试用版,它允许基本编辑。让我们吐槽一下:他们到底为什么不制作 javascript 版本?我错过了一些东西 - 像往常一样:-)。
添加第二个屏幕截图以显示更有趣的对象模型信息花絮:
如果你想试试,这里有一些其他的 CreateObject 语句你可以试试:
Set autoupdate = CreateObject("Microsoft.Update.AutoUpdate")
Set fso = CreateObject("Scripting.FileSystemObject")
Set scriptshell = CreateObject ("WScript.Shell")
Set dictionary = CreateObject("Scripting.Dictionary")
Set shell = CreateObject("Shell.Application")
【讨论】:
感谢您的详尽回答。除了在这台机器上,常规 msi 工作正常(如问题中所述),所以我认为这是与 WiX 相关的问题。这个安装程序的主要目的是便携和可靠,所以我希望它能够在这台机器上工作,即使它有问题(问题不会那么糟糕,因为常规 msi 可以工作)。所以很遗憾,我不能使用“你的机器坏了”作为解决方案(无论如何我宁愿避免它)。另外,使用 MSIFASTINSTALL,这是一台 XP 机器,不能保证有 Windows Installer 4.5(是吗?) 好的,我查看了 WiX 源代码。请参阅上面的更新答案。 VBScript 应该没问题,它只是暂停更新组件,但一如既往地使用风险自负。祝你好运,希望你能找到解决办法。这是一台非常重要的机器吗?手指交叉你没有发现恶意软件。请检查 - 直觉是那里有什么东西。只是我的 2 美分... 是的,对不起。 XP 和 Windows Installer 版本的金发时刻。在我看来,这些天只有 Windows 7,8 和 10 存在:-)。 @SteinÅsmul - 嗨 Stein。我看过你的两个答案,包括这个。我必须说你是最好的作家之一。这是为数不多的详细答案之一,包括与 VS 相关的答案(大约 10 天前),您几乎利用 SO 的整个空间来详细描述问题。我很欣赏你的知识和技能;希望有一天我会像你一样写答案。 @Am_I_Helpful - 非常感谢您的客气话。有时我觉得我回答了所有问题,但提出的实际问题除外 :-) - 发生的频率比我想的要多。当您调试和测试时,链接和 cmets 很快就会变得太多,但我认为我们应该将调试进度留给其他人看看,以防他们通过我们所经历的步骤获得更好的想法。以上是关于WiX 在 Windows 更新问题的 XP 机器上表现不佳的主要内容,如果未能解决你的问题,请参考以下文章
使用Visual Studio 2015 安装到Windows XP 构建的VB 应用程序