Создание полностью проверенной подписанной установки с помощью автоматизации

В следующем примере показано, как заполнить таблицы MsiDigitalCertificate и MsiDigitalSignature с помощью подпрограммы Visual Basic для приложений (VBA). Дополнительные сведения о защите пакетов установщика Windows см. в статье Рекомендации по созданию безопасных установок.

Метод FileSignatureInfo возвращает значение SAFEARRAY в байтах. Дополнительные сведения см. в разделе Тип данных SAFEARRAY. Данные из этого массива должны быть преобразованы в Юникод, так как в Visual Basic нет способа записи байтов непосредственно в файл. Затем метод SetStream может использовать файл преобразованных данных для записи потоковых данных в указанное поле записи объекта Record. Обратите внимание, что преобразование байтовых данных в Юникод может изменить данные и что преобразованные данные должны соответствовать исходным данным для правильной проверки подписи. Автор пакета должен убедиться, что исходные и преобразованные данные совпадают.

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