使用自動化撰寫完整驗證的已簽署安裝
下列範例示範如何使用 Visual Basic for Applications (VBA) 子程式,在 和 MsiDigitalSignature 數據表 填入 MsiDigitalCertificate 數據表。 如需保護 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