使用自动化创作完全验证的已签名安装

以下示例演示如何使用 Visual Basic for Applications (VBA) 子例程填充 MsiDigitalCertificate 表MsiDigitalSignature 表。 若要详细了解如何保护 Windows Installer 包,请参阅创作安全安装指南

FileSignatureInfo 方法返回字节的 SAFEARRAY。 有关详细信息,请参阅 SAFEARRAY 数据类型。 该数组中的数据必须转换为 Unicode,因为 Visual Basic 无法直接将字节写入文件。 然后,SetStream 方法可以使用已转换数据的文件将流数据写入 Record 对象指定的记录字段。 请注意,将字节数据转换为 Unicode 可能会更改数据,并且已转换的数据必须与原始数据匹配才能进行正确的签名验证。 包作者必须确保原始数据与已转换的数据相匹配。

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