Создание полностью проверенной подписанной установки с помощью автоматизации
В следующем примере показано, как заполнить таблицы MsiDigitalCertificate и MsiDigitalSignature с помощью подпрограммы Visual Basic для приложений (VBA). Дополнительные сведения о защите пакетов установщика Windows см. в статье Рекомендации по созданию безопасных установок.
Метод FileSignatureInfo возвращает значение SAFEARRAY в байтах. Дополнительные сведения см. в разделе Тип данных SAFEARRAY. Данные из этого массива должны быть преобразованы в Юникод, так как в Visual Basic нет способа записи байтов непосредственно в файл. Затем метод SetStream может использовать файл преобразованных данных для записи потоковых данных в указанное поле записи объекта Record. Обратите внимание, что преобразование байтовых данных в Юникод может изменить данные и что преобразованные данные должны соответствовать исходным данным для правильной проверки подписи. Автор пакета должен убедиться, что исходные и преобразованные данные совпадают.
Sub PopulateDigitalSignature()
Dim Installer As Object
Dim Database As Object
Dim x() As Byte
Const szSignedCabinet = "c:\test.cab"
Const szCertFile = "c:\temp\test.cer"
Const szDatabase = "c:\test.msi"
Set Installer = CreateObject("WindowsInstaller.Installer")
x = Installer.FileSignatureInfo(szSignedCabinet, 0, msiSignatureInfoCertificate)
Dim fs, ts
Dim s As String
Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.CreateTextFile(szCertFile, True) 'Create a file
s = StrConv(x, vbUnicode)
ts.Write s
ts.Close
Set Database = Installer.OpenDatabase(szDatabase, msiOpenDatabaseModeTransact)
Set ViewCert = Database.OpenView("SELECT * FROM `MsiDigitalCertificate`")
ViewCert.Execute 0
Set ViewSig = Database.OpenView("SELECT * FROM `MsiDigitalSignature`")
ViewSig.Execute 0
Set RecordCert = Installer.CreateRecord(2)
RecordCert.StringData(1) = "Test"
RecordCert.SetStream 2, szCertFile
ViewCert.Modify msiViewModifyInsert, RecordCert
Set RecordSig = Installer.CreateRecord(4)
RecordSig.StringData(1) = "Media"
RecordSig.StringData(2) = "1"
RecordSig.StringData(3) = "Test"
ViewSig.Modify msiViewModifyInsert, RecordSig
Database.Commit
fs.DeleteFile(szCertFile)
End Sub