Freigeben über


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