Compartilhar via


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