sysprep /generalize /oobe /shutdown 跑完,镜像启动到桌面,再双击 vc_redist.x64.exe,进度条刚起来就退出,屏幕上只留下一行「安装失败 0x80070666」。硬件和系统本身大多没坏,镜像已经封装好的不必推翻重做,多数情况在现成的系统里就能修好。
先分清是版本本来就撞了、封装顺序不对,还是上次卸载留下的记录没清,再决定动哪一层。分清层次能省掉大量反复重装的工夫。
适用系统 Windows 10/11,下面这些步骤在本地实机上验证过。
安装包启动后会先扫注册表里的产品记录。读到同版本、同位数的 Visual C++ 记录,就直接返回这个退出码,不再往下走。英文原话是:
Another version of this product is already installed. Installation of this version cannot continue.
退出码本身不代表装不上,安装包的意思是没必要再装。会走到这一步的场景大致三类:
HKLM\SOFTWARE\Classes\Installer\Products 下面
版本号一致时安装包必然返回 0x80070666,动手卸载之前,先把镜像里已经装了哪些包、什么版本查清楚。
Microsoft Visual C++ 2015-2022 Redistributable (x64) 和 (x86) 两条记录,把版本号抄下来HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallDisplayName 和 DisplayVersion,凡是带 Visual C++ 的都记下来HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall,x86 版的记录一般在这里vc_redist.x64.exe、vc_redist.x86.exe 的版本比对,两边一致就是冲突的源头查出来的版本号截图存一份,后面几步还要反复对照。

先按现象选办法,不要一上来就卸载重装:
现象 | 卡在哪一层 | 先试哪个办法 |
|---|---|---|
x64、x86 版本号和安装包一致 | 产品记录重复 | 原地修复 |
修复后退出码 1603,或仍报 0x80070666 | 记录没被清掉 | 卸载重装 |
卸载并重启后记录仍在 | 残留 ProductCode | msiexec 清除 |
每次封装完都弹这个码 | 检测顺序不对 | 改封装顺序 |
版本号对得上就不必硬装,直接让安装包修它自己,比重装一遍快,也不会动到镜像里其他组件。
cd /d 切到 vc_redist 安装包所在的文件夹vc_redist.x64.exe /repair /quiet /norestartvc_redist.x86.exe /repair /quiet /norestartecho %errorlevel% 看退出码,0 表示修复成功,3010 表示重启后才生效sysprep /generalize /oobe /shutdowncd /d D:\redist
vc_redist.x64.exe /repair /quiet /norestart
vc_redist.x86.exe /repair /quiet /norestart
echo %errorlevel%
/quiet表示不弹任何窗口,/norestart把重启交给你自己控制。如果修复后退出码是1603或仍报 0x80070666,说明注册表里的产品记录没被清掉,进入下一步卸载重装。
修复无效时先卸干净再装,x86 和 x64 都要各走一遍,漏掉一个另一个照样报错。
vc_redist.x64.exe /uninstall /quiet /norestartvc_redist.x86.exe /uninstall /quiet /norestartvc_redist.x64.exe /install /quiet /norestart,装完再装 x86 包同样是重装,做法差一点结果差很多:先卸、两个位数都卸干净、卸完必须重启。如果卸载阶段就报错,或者重启后记录还在,或者重装又弹 0x80070666,说明卸载没走完,转入下一步用 msiexec 清。
产品记录卡在注册表里时,只有按 ProductCode 卸载,才能把残留清干净。
HKLM\SOFTWARE\Classes\Installer\ProductsProductName,找到 Visual C++ 对应的那一项,键名就是压缩过的 ProductCodeUninstallString 或 ModifyPath 里完整的 {ProductCode}msiexec /x {ProductCode} /qn{ProductCode} 分别执行一遍,清完重启vc_redist.x64.exe /install /quiet /norestart,能正常装进去就说明记录已经清干净msiexec /x {ProductCode} /qnProductCode 是一串带大括号的 GUID,抄的时候别漏掉两侧的
{ },少一个字符 msiexec 就报1619或1605。
让运行库在 generalize 之前就装好,检测环节自然不会再拦你。
Ctrl+Shift+F3,进入审核模式(Audit Mode),系统会自动以管理员身份登录vc_redist.x64.exe 和 vc_redist.x86.exe,确认 设置→应用→已安装的应用 里两条都在sysprep /generalize /oobe /shutdown,generalize 阶段就不会重复做版本检测unattend.xml 的 FirstLogonCommands,改成首次登录时静默安装从安装到封装、部署再到兜底,一层管一段,哪一层漏了就补哪一层。
sysprep 封装后装 VC++ 运行库报 0x80070666 是什么原因?
这个码说明版本撞了——安装包在注册表里读到同版本记录,判定没必要再装。另一种可能是上一次卸载的产品记录没清干净。
0x80070666 提示已经安装另一个版本的产品,卸载了还是报怎么办?
多半是卸载没走完,x86 或 x64 其中一个的记录还留在 HKLM\SOFTWARE\Classes\Installer\Products 下面。按第三步找到对应的 {ProductCode},用 msiexec /x 清掉再重装。
vc_redist.x64.exe /repair 修复后仍返回 0x80070666 怎么处理?
/repair 只重写已经注册的组件文件,不改产品记录。这种情况直接跳到卸载重装,仍不行再用 msiexec 按 ProductCode 清一遍。
msiexec /x 卸载 VC++ 运行库要填的 ProductCode 在哪里查?
在 regedit 的 HKLM\SOFTWARE\Classes\Installer\Products 下,按右侧 ProductName 找到 Visual C++ 那一项,键名就是 ProductCode;Uninstall 项里的 UninstallString 也带完整的大括号 GUID。
在审核模式先装好运行库再 sysprep /generalize,部署到新机器还会报 0x80070666 吗?
通常不会。generalize 阶段不再重复做版本检测,运行库随镜像一起落到新机器上,正常情况不会再触发这个退出码。如果新机器上提示的是某个组件缺失而不是这个错误码,那是组件文件确实没落到镜像里,重新补一遍缺失的运行库组件即可。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。