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