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

问题描述 投票:0回答:1

我试图执行sql脚本而不使用本机installshield功能。我已将sql文件存储在二进制表中(不支持文件,因为它不安全)。在msi文件中,我已经看到任何二进制文件的完整路径被替换为“ {binaryname}“花括号名称。如何在其他自定义操作中使用带花括号的二进制名称?有没有像我们在日常访问中访问公共属性的方法?

windows-installer installshield
1个回答
0
投票

我不同意Binary table比ISSetupFile表更安全或更不安全的概念。它们都存储(引用)其记录中的二进制流,并且可以通过变换进行更改。也许你的意思是可以轻松改变已经提取的文件?但是,让我们把它放在一边,专注于你的问题。

花括号是InstallShield在这种情况下用于指示二进制表引用的可视表示法。它不是Windows Installer识别的符号。所以你必须找到一些东西。

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

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

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

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

因为你可能知道你的二进制表的记录的名称,你可以硬编码为'namehere'代替?并跳过记录。请注意表和列名称周围的反引号,但值周围的撇号。或者,为了更好的安全性,您可以使用问号占位符,并使用MsiCreateRecord和MsiRecordSetString填充记录。

其他语言以不同方式公开相同的底层功能。有关VBScript中的概述,请参阅SDK示例WIStream.vbs,但请注意,您的操作必须作为自定义操作而不是外部脚本运行。

© www.soinside.com 2019 - 2024. All rights reserved.