Compartir a través de


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