Tworzenie w pełni zweryfikowanej podpisanej instalacji przy użyciu automatyzacji
W poniższym przykładzie pokazano, jak wypełnić tabelę MsiDigitalCertificate i tabelę MsiDigitalSignature przy użyciu podprocedury Visual Basic for Applications (VBA). Aby uzyskać więcej informacji na temat zabezpieczania pakietów Instalatora Windows, zobacz Wytyczne dotyczące tworzenia bezpiecznych instalacji.
Metoda FileSignatureInfo zwraca SAFEARRAY bajtów. Aby uzyskać więcej informacji, zobacz SAFEARRAY Data Type. Dane z tej tablicy muszą być konwertowane na Unicode, ponieważ język Visual Basic nie ma możliwości zapisu bajtów bezpośrednio w pliku. Metoda SetStream może następnie użyć pliku z danymi po konwersji, aby zapisać dane strumienia w określonym polu rekordu w obiekcie . Należy pamiętać, że konwersja danych bajtów na Unicode może potencjalnie zmienić dane i że przekonwertowane dane muszą być zgodne z oryginalnymi danymi w celu poprawnej weryfikacji podpisu. Autor pakietu musi upewnić się, że oryginalne i przekonwertowane dane są zgodne.
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