0

我正在使用 python msilib库读取 MSI 文件。我的目标是从二进制表中提取 [二进制数据] 并转储到文件中。(使用 ORCA 工具,我们可以通过双击 [Binary Data] 单元格提取二进制数据并写入文件)

我找不到任何 msilib 方法来获取二进制数据。它有使用 Record.GetString(field) 获取字符串数据的方法。但正如预期的那样,这不适用于 [Binary Data] 并给出错误。

这是代码片段

import msilib
# msi file path which is to be read
msiFilePath = "C:/msi/test.msi"
dbObj = msilib.OpenDatabase(msiFilePath, msilib.MSIDBOPEN_READONLY)
sqlQuery = "select * from Binary"
view = dbObj.OpenView(sqlQuery)
view.Execute(None)
cur_record = viewObj.Fetch()
# In Binary table; Column no 1 have string data and Column # 2 have [Binary Data]
cur_record.GetString(2)

并在执行时:-

Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
cur_record.GetString(2)
_msi.MSIError: unknown error 70c

有什么办法吗?

4

1 回答 1

7

msilib功能不全。具体来说,它不能读取二进制数据。

Pygame 托管了一个更全功能和可扩展的(因为它是用 Python 和 ctypes 编写的),msidb。pygame 文档中似乎没有涵盖它,但源代码非常简单。

您需要的 MSI API 是其类使用的MsiRecordReadStreampygame.msidb 包装。get_field_streamCursor

于 2013-02-08T11:32:27.133 回答