Como criar uma instalação assinada totalmente verificada usando a automação
O exemplo a seguir demonstra como preencher a tabela MsiDigitalCertificate e a tabela MsiDigitalSignature usando uma sub-rotina do VBA (Visual Basic for Applications). Para obter mais informações sobre como proteger pacotes do Windows Installer, confira Diretrizes para criar instalações seguras.
O método FileSignatureInfo retorna uma SAFEARRAY de bytes. Para obter mais informações, confira o Tipo de dados SAFEARRAY. Os dados dessa matriz precisam ser convertidos em Unicode porque o Visual Basic não tem uma forma de gravar os bytes diretamente em um arquivo. Em seguida, o método SetStream pode usar o arquivo de dados convertidos para gravar os dados de fluxo em um campo de registro especificado de um objeto Record. Observe que a conversão dos dados de byte em Unicode pode alterar os dados e que os dados convertidos precisam corresponder aos dados originais para a verificação de assinatura correta. O autor do pacote precisa garantir que os dados originais e convertidos sejam correspondentes.
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