从EXE中提取MSI

我想提取EXE安装程序的MSI以通过networking发布。

例如,使用通用提取器,但不适用于Java运行时环境。

7-Zip应该可以做到这一点。

有了它,你可以提取EXE中的所有文件(因此,也是一个MSI文件)。

虽然你可以用7-Zip来实现,但更好的方法是SteinÅsmul指出的pipe理安装。

对于基于InstallShield MSI的项目,我发现以下工作:

setup.exe /s /x /b"C:\FolderInWhichMSIWillBeExtracted" /v"/qn" 

这个命令会导致在一个你可以自由指定的目录中提取MSI,并在产品的一个静默卸载失败。

命令行基本上告诉setup.exe试图卸载产品(/ x),并默默地执行(/ s)。 在这样做的时候,应该把MSI提取到一个特定的位置(/ b)。

/ v命令将parameter passing给Windows Installer,在这种情况下是/ qn参数。 / qn参数将禁用安装程序的任何GUI输出。

只是一个免责声明 :一个setup.exe文件可以包含一个embedded式MSI,它可以是一个传统的风格(非MSI)安装程序,或者它可以只是一个常规的可执行文件,无论如何都无法提取。 下面的“讨论”首先介绍如何使用MSI文件的pipe理图像以及如何从setup.exe文件中提取MSI文件。 然后它提供了一些链接来处理其他types的setup.exe文件。 另请参阅评论部分。 请记住,“最后的手段”是启动安装程序,然后在temp文件夹中查找提取的文件。


内置MSI支持文件提取(admin安装)

MSI或Windows Installer 内置了对此的支持 – 从MSI文件中提取文件。 这被称为pipe理安装 。 它基本上是作为一种方式来创build一个networking安装点 ,从中可以在许多目标计算机上运行安装。 这确保了源文件始终可用于任何修复操作。

请注意,运行pipe理员安装与使用压缩工具来提取文件是非常不同的! 后者不会调整媒体表的媒体布局,以便将包设置为使用外部源文件 – 这是正确的方法。 总是喜欢运行实际的pipe理员安装任何hacky拉链提取。 至于压缩,在MSI文件格式中实际上有三种不同的压缩algorithm用于cab文件:MSZip,LZX和Storing(未压缩)。 所有这些都通过pipe理安装正确处理。

重要提示 : Windows Installer会在系统上caching已安装的MSI文件以进行修复,修改和卸载scheme。 从Windows 7(MSI版本5)开始, MSI文件现在被caching为全尺寸,以避免打破文件签名,阻止UAC提示设置启动(已知的Vista问题)。 这可能会导致磁盘空间消耗的巨大增加(对于某些系统而言是几个千兆字节)。 为防止caching巨大的MSI文件,您应该在安装之前运行该软件包的pipe理员安装。 这是一个在托pipenetworking中正确部署的公司如何做的事情,它将删除cab文件,并使用一个小的MSI文件和文件作为networking安装点。


pipe理员安装有很多用途

build议阅读更多关于pipe理安装,因为它是一个有用的概念,我已经写了一个post在stackoverflow: 什么是使用msiexec / a启动pipe理安装的目的?

实质上,pipe理员安装对于:

  • 提取并检查安装程序文件
    • 了解什么是实际安装和在哪里
    • 为了确保文件看起来值得信赖和安全(没有病毒 – 恶意软件和病毒仍然可以隐藏在MSI文件中)
  • 通过系统pipe理软件进行部署(例如SCCM
  • 公司应用程序重新包装
  • 修理,修改和自我修复操作
  • 修补和升级
  • 微星广告(其中包括其他细节,这涉及到“ 从源代码运行 ”function,您可以直接从networking共享中运行,而您只能安装快捷方式和registry数据)
  • 其他一些较小的细节

请阅读上面链接的stackoverflowpost了解更多详情。 对于系统pipe理员应用程序打包人员设置开发人员发布pipe理人员甚至普通用户来说 ,看到他们正在安装什么,这都是一个非常重要的概念。


pipe理员安装,实用的方法

您可以使用几种不同的方式执行pipe理安装,具体取决于安装程序的交付方式。 本质上它是作为一个MSI文件交付或包装在一个setup.exe文件

提升的命令提示符处运行这些命令,然后按照GUI中的说明进行交互式命令行操作:

  • MSI文件

     msiexec /a File.msi 

    那就是用GUI来运行,你也可以静静地做:

     msiexec /a File.msi TARGETDIR=C:\MyInstallPoint /qn 
  • setup.exe文件

     setup.exe /a 

setup.exe文件也可以是遗留风格的安装程序(非MSI)或令人畏惧的Installscript MSI文件types – 一种众所周知的多functionInstallshield项目types,其混合的非标准兼容的MSI格式。 它本质上是一个定制的,更高级的graphics用户界面,但也充满了错误。

对于传统的setup.exe文件/ a将不会执行任何操作,但是您可以尝试/ extract_all:[path]开关,本pdf所述 。 这对于静音安装和其他方面也是很好的参考。 另一个资源是Installshield setup.exe命令行参数的列表 。

MSI补丁文件 (* .MSP)可以应用于pipe理图像以正确提取其文件。 7Zip也将能够提取文件,但他们将无法正确格式化。

最后 – 最后的手段 – 如果没有其他的方法,你可以通过清除系统上的临时文件夹,交互地启动setup.exe,然后等待第一个对话框出现,来获得提取的安装文件。 在大多数情况下,安装程序将提取一堆文件到临时文件夹 。 有时候这些文件很简单,有些时候是CAB格式的文件,但是Winzip,7Zip甚至Universal Extractor(还没有testing过这个产品) – 可以打开这些文件。

我猜这个问题主要是关于给定标签的InstallShield,但是如果有人在这里遇到与基于WiX的软件包相同的问题(也可能是其他问题),只需使用/ extract调用安装程序即可:

 C:\> installer.exe /extract 

这将把MSI放在安装程序旁边的文件夹中。

从参数开始:

 setup.exe /A 

要求保存包含的文件(包括MSI )。

这可能取决于创buildsetup.exe的软件。

唯一的方法是运行exe并收集MSI。 你必须注意的是,如果你使用MST转换MSI,他们可能会迷路。

我使用这个批处理命令行:

 SET TMP=c:\msipath MD "%TMP%" SET TEMP=%TMP% start /d "c:\install" install.exe /L1033 PING 1.1.1.1 -n 1 -w 10000 >NUL for /R "%TMP%" %%f in (*.msi) do copy "%%f" "%TMP%" taskkill /F /IM msiexec.exe /T 

启动安装程序,但不要按安装>button。 然后

 cd "%AppData%\..\LocalLow\Sun\Java" 

并find您的MSI文件在一个子目录(例如, jre1.7.0_25 )。

请注意,该子目录中的Data1.cab也是必需的。

没有必要使用任何工具! 我们可以按照简单的方式。

我不知道哪个工具build立了你的自解压安装程序,所以我将不得不提供一个通用的响应。

大多数这种性质的程序将软件包文件(.msi)提取到TEMP目录中。 此行为是InstallShield Developer的默认行为。

如果没有附加信息,我build议您只需启动安装程序,一旦显示第一个MSI对话框,就可以检查您的TEMP目录中新build的子目录或MSI文件。 在取消/停止安装程序之前,只需从TEMP文件夹中复制该MSI文件。 之后,您可以取消安装。