【发布时间】:2018-01-26 13:58:12
【问题描述】:
我正在尝试使用 Powershell 从 MSI 文件中提取二进制数据。 我可以获取任何其他数据,但我似乎无法提取二进制信息。
$Query = "SELECT Data FROM Binary WHERE Name = 'bannrbmp'"
$View = $Database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $Database, ($Query))
$View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)
$Record = $View.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $View, $null)
$BinaryData = $Record.GetType().InvokeMember("StringData", "GetProperty", $null, $Record, 1)
它在最后一行中断,这让我相信“StringData”存在问题,但我可能会偏离目标。这是这张桌子在 Orca 中打开时的样子。
当提取文本数据时,此代码将成功完成,如下所示。
$Query = "SELECT Component FROM FeatureComponents WHERE Feature = 'OrcaHelp'"
$View = $Database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $Database, ($Query))
$View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)
$Record = $View.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $View, $null)
$Data = $Record.GetType().InvokeMember("StringData", "GetProperty", $null, $Record, 1)
我似乎在网上找不到任何东西,如果有人能够提供帮助,将不胜感激。
【问题讨论】:
-
你是什么意思它在最后一行中断?伴随此有错误吗?
-
bannerbmp(基于 banner 和 bmp)很可能是位图。还有其他几个包含 ico,这表明它们是图标。为什么您希望位图或图标支持
StringData?就此而言,您为什么希望 any 二进制数据自动支持StringData?不是字符串数据,是二进制数据。 -
看看 Record.ReadStream。但老实说,所有这些 COM 互操作在 IMO 中都非常混乱,而且您并没有关闭句柄。如果您有兴趣,我可以为您指出其他方法。
-
Matt 它只是抛出一个异常,什么也没说。 Ken,我正在尝试从 MSI 中的 exe 中提取图标,我知道它不是字符串数据。 @ChristopherPainter 我很想知道我可以用来解决这个问题的任何方法。
-
其他人做对了 - 二进制数据是使用 ReadStream 类型的 API 提取的。
标签: powershell windows-installer