Udostępnij za pośrednictwem


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