Share via


Creazione di un'installazione con firma completa con Automazione

Nell'esempio seguente viene illustrato come popolare la tabella MsiDigitalCertificate e la tabella MsiDigitalSignature usando una sottoroutine Visual Basic, Applications Edition (VBA). Per altre informazioni sulla protezione dei pacchetti di Windows Installer, vedere Linee guida per la creazione di installazioni sicure.

Il metodo FileSignatureInfo restituisce un valore SAFEARRAY di byte. Per altre informazioni, vedere il tipo di dati SAFEARRAY. I dati di questa matrice devono essere convertiti in Unicode perché Visual Basic non dispone di un modo per scrivere byte direttamente in un file. Il metodo SetStream può quindi usare il file di dati convertiti per scrivere dati di flusso in un campo record specificato di un oggetto Record. Si noti che la conversione dei dati di byte in Unicode può potenzialmente modificare i dati e che i dati convertiti devono corrispondere ai dati originali per la verifica della firma corretta. L'autore del pacchetto deve assicurarsi che i dati originali e convertiti corrispondano.

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