Erstellen einer vollständig überprüften signierten Installation mithilfe der Automatisierung
Im folgenden Beispiel wird veranschaulicht, wie die MsiDigitalCertificate-Tabelle und MsiDigitalSignature-Tabelle mithilfe einer VBA-Unterroutine (Visual Basic for Applications) aufgefüllt werden. Weitere Informationen zum Schützen von Windows Installer-Paketen finden Sie unter Richtlinien für die Erstellung sicherer Installationen.
Die FileSignatureInfo-Methode gibt einen SAFEARRAY-Wert in Bytes zurück. Weitere Informationen finden Sie unter dem SAFEARRAY-Datentyp. Die Daten aus diesem Array müssen in Unicode konvertiert werden, da Visual Basic keine Möglichkeit hat, Bytes direkt in eine Datei zu schreiben. Die SetStream-Methode kann dann die Datei mit konvertierten Daten verwenden, um Streamdaten in ein bestimmtes Datensatzfeld eines Record-Objekts zu schreiben. Beachten Sie, dass sich die Daten durch die Konvertierung der Bytedaten in Unicode ändern können und dass die konvertierten Daten mit den ursprünglichen Daten übereinstimmen müssen, um eine ordnungsgemäße Signaturüberprüfung zu gewährleisten. Der Ersteller des Pakets muss sicherstellen, dass die ursprünglichen und konvertierten Daten übereinstimmen.
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