是否有工具或机制可以从 Windows MSI 文件中检索可用的公共属性?
一些提供 MSI 文件的供应商自己并没有记录这些文件,所以我很好奇是否有办法在没有源代码的情况下公开这些文件。
答案1
莱西提供命令行以及交互式应用程序,用于从 .msi 检索任何属性。
以交互方式打开 .msi,然后转到表格视图并选择或键入“属性”。但是,虽然这给出了属性名称,但它并没有给出该属性的有效值。(或者我还没有找到正确的查找位置。)
命令行将属性表列出到控制台(令人沮丧的是,无法通过简单的> output.csv
重定向捕获)
lessmsi l -t Property ...\path\to\setup.msi
答案2
莱姆西是一款非常棒的工具,如果您愿意打开它的 GUI 并进行一些手动调查,它肯定能在这里发挥作用。但是,我要说的是,以下命令不能可靠地显示所有属性:
lessmsi l -t Property <msi_name>
保证获得所有可能属性的一种(更好的)方法是实际使用 MSI 文件执行安装、修复或卸载并记录该过程。以下命令仅记录属性而不记录其他任何内容:
<msi_name> /lp! <msi_property_logfile>
上述命令相当于:
msiexec /lp! <msi_property_logfile> /i <msi_name>
不过,我更喜欢的方法是不是实际安装/移除/修复(并简单地提取)。这种方法比莱姆西它不需要第三方实用程序(即莱姆西),并且它不需要您进行任何安装。假设您有足够的磁盘空间来实际安装该程序,您可以执行以下操作:
msiexec /a <msi_name> /lp! <msi_property_logfile> TARGETDIR=<absolute_path_to_extract_to>
请注意,<absolute_path_to_extract_to>
可以指向不存在的目录(该命令将创建必要的目录或失败)。
如果您出于某种原因讨厌安装 UI,则可以附加/qr
选项,这将“减少”甚至消除 UI,而不会损害属性记录过程。但请注意 - 如果您“低于”简化的 UI(即/qb
|/passive
或/qn
| /quiet
),您<msi_property_logfile>
可能会丢失一些属性。
答案3
鉴于 MSI 文件将公共属性存储在内部数据库中,您实际上可以使用 VBScript 和 SQL 查询它们。
以下是示例脚本这将返回 MSI 文件中存储的所有属性。通常使用大写字母来定义公共属性,因此通常可以这样识别它们。
答案4
我认为现在最好的方法可能是使用 powershell。下面是一个可以很好地完成这项工作的脚本: https://gallery.technet.microsoft.com/scriptcenter/Get-MsiDatabaseProperties-09d9c87c