Partager via


Création d’une installation signée entièrement vérifiée à l’aide d’Automation

L’exemple suivant montre comment remplir la table MsiDigitalCertificate et la table MsiDigitalSignature à l’aide d’une sous-routine Visual Basic pour Applications (VBA). Pour plus d’informations sur la sécurisation des packages Windows Installer, consultez Recommandations pour la création d’installations sécurisées.

La méthode FileSignatureInfo retourne un SAFEARRAY d’octets. Pour plus d’informations, consultez le type de données SAFEARRAY. Les données de ce tableau doivent être converties en Unicode, car Visual Basic n’a pas de moyen d’écrire des octets directement dans un fichier. La méthode SetStream peut ensuite utiliser le fichier de données converties pour écrire des données de flux dans un champ d’enregistrement spécifié d’un objet Record. Notez que la conversion des données d’octets en Unicode peut potentiellement modifier les données, et que les données converties doivent correspondre aux données d’origine pour une vérification de signature correcte. L’auteur du package doit s’assurer que les données d’origine et converties correspondent.

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