Creación de una instalación firmada totalmente comprobada mediante automatización
En el ejemplo siguiente se muestra cómo rellenar la tabla MsiDigitalCertificate y la tabla MsiDigitalSignature mediante una subrutina de Visual Basic para Aplicaciones (VBA). Para obtener más información sobre cómo proteger los paquetes de Windows Installer, consulte Directrices para crear instalaciones seguras.
El método FileSignatureInfo devuelve una SAFEARRAY de bytes. Para obtener más información, consulte el tipo de datos SAFEARRAY. Los datos de esta matriz se deben convertir en Unicode porque Visual Basic no tiene una manera de escribir bytes directamente en un archivo. Después, el método SetStream puede usar el archivo de datos convertidos para escribir datos de flujo en un campo de registro especificado de un objeto Record. Tenga en cuenta que la conversión de los datos de bytes a Unicode puede cambiar los datos y que los datos convertidos deben coincidir con los datos originales para comprobar la firma correcta. El autor del paquete debe asegurarse de que los datos originales y convertidos coincidan.
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