オートメーションを使用して完全に検証された署名済みインストールを作成する
次の例では、Visual Basic for Applications (VBA) サブルーチンを使用して MsiDigitalCertificate テーブルと MsiDigitalSignature テーブルを設定する方法を示します。 Windows インストーラー パッケージのセキュリティ保護の詳細については、「セキュリティで保護されたインストールの作成に関するガイドライン」を参照してください。
FileSignatureInfo メソッドは、バイトの SAFEARRAY を返します。 詳細については、「SAFEARRAY データ型」を参照してください。 Visual Basic にはバイトを直接ファイルに書き込む方法がないため、この配列のデータを Unicode に変換する必要があります。 その後、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