자동화를 사용하여 완전히 확인된 서명된 설치 작성

다음 샘플에서는 VBA(Visual Basic for Applications) 서브루틴을 사용하여 MsiDigitalCertificate 테이블MsiDigitalSignature 테이블을 채우는 방법을 보여 줍니다. Windows Installer 패키지 보안에 대한 자세한 내용은 보안 설치 작성 지침을 참조하세요.

FileSignatureInfo 메서드는 바이트의 SAFEARRAY를 반환합니다. 자세한 내용은 SAFEARRAY 데이터 형식을 참조하세요. Visual Basic에는 바이트를 파일에 바로 쓸 방법이 없으므로 이 배열의 데이터를 유니코드로 변환해야 합니다. 그런 다음 SetStream 메서드는 변환된 데이터의 파일을 사용하여 스트림 데이터를 레코드 개체의 지정된 레코드 필드에 쓸 수 있습니다. 바이트 데이터를 유니코드로 변환하면 데이터가 변경될 수 있으며 변환된 데이터는 올바른 서명 확인을 위해 원래 데이터와 일치해야 합니다. 패키지 작성자는 원래 데이터와 변환된 데이터가 일치하는지 확인해야 합니다.

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