如何访问二进制表并在管理代码自定义操作中使用?

时间:2019-02-12 11:31:06

标签: windows-installer installshield

我正在尝试不使用本机installshield功能执行sql脚本。我已将sql文件存储在二进制表中(由于不安全,因此不存储在支持文件中)。在msi文件中,我已经看到任何二进制文件的完整路径是大括号名称替换为“ {binaryname}”。如何在其他自定义操作中使用带有花括号的二进制名称?有什么办法像我们在customactions中访问Public属性吗?

1 个答案:

答案 0 :(得分:0)

我不同意Binary table比ISSetupFile表安全得多的观点。它们都在其记录中存储(引用)二进制流,并且可以通过转换进行更改。也许您的意思是可以轻松地更改已提取的文件?但是让我们搁置一旁,专注于您的问题。

花括号是InstallShield在这种情况下使用的一种视觉表示法,用于指示Binary表引用。 Windows Installer无法识别该符号。所以你必须找到一些东西。

如果要在自定义操作期间使用二进制表记录的内容,则有两个选项:

  1. 将其作为执行的自定义操作的一部分,使CustomAction定义本身引用二进制记录。例如。类型1自定义操作通常会运行二进制表中存储的dll。如果可以控制,您可以将额外的数据附加到该dll。
  2. 通过查询表自己提取二进制记录。请注意,这只能在立即模式自定义操作中完成,因此,如果您在延迟模式(脚本执行)中需要它,则必须提前将其提取,然后放到文件系统上或走私(er,通过CustomActionData)。

如果您在C ++ DLL中执行后者,则可能需要的功能至少包括以下内容:

  • MsiGetActiveDatabase
  • MsiDatabaseOpenView:SELECT * FROM `Binary` WHERE `Name`=?
  • MsiViewExecute:在花括号中传递包含名称的记录
  • MsiViewFetch
  • MsiRecordReadStream
  • MsiCloseHandle

由于您大概知道二进制表记录的名称,因此可以将其硬编码为'namehere'来代替?并跳过该记录。注意表和列名前后的反引号,但值前后用撇号引起来。或者,为了提高安全性,您可以使用问号占位符,并使用MsiCreateRecord和MsiRecordSetString填充记录。

其他语言以不同的方式公开相同的基础功能。例如,请参见SDK示例WIStream.vbs,以了解VBScript的概述,但请注意,您必须将其作为自定义操作而不是外部脚本来运行。