Criação de uma instalação assinada totalmente verificada usando automação

O exemplo seguinte demonstra como preencher a tabela MsiDigitalCertificate e a tabela MsiDigitalSignature usando uma subrotina do Visual Basic for Applications (VBA). Para obter mais informações sobre como proteger pacotes do Windows Installer, consulte Diretrizes para criação de instalações seguras.

O método FileSignatureInfo retorna um SAFEARRAY de bytes. Para obter mais informações, consulte o Tipo de dados SAFEARRAY. Os dados dessa matriz devem ser convertidos em Unicode porque o Visual Basic não tem uma maneira de gravar bytes diretamente em um arquivo. O método SetStream pode usar o arquivo de dados convertidos para gravar dados de fluxo em um campo de registro especificado de um objeto Record. Observe que a conversão dos dados de byte para Unicode pode potencialmente alterar os dados e que os dados convertidos devem corresponder aos dados originais para a verificação correta da assinatura. O autor do pacote deve garantir que os dados originais e convertidos coincidam.

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