Как получить свойства MST из VBScript - PullRequest
1 голос
/ 27 мая 2019

Итак, я создаю vbscript, который будет читать файлы MSI и MST.Идея состоит в том, что если пользователь, который будет запускать сценарий, тестирует MSI с включенным файлом MST, сценарий должен создать «отчет» о новых свойствах этого MST.

Я могу получить свойства от обычного MSI, проблема в том, что я пытаюсь попасть в раздел MST.В ходе исследования я узнал о таблице _TransformView, и это должно помочь мне получить эту информацию, но я не уверен, что знаю, как обращаться с этой таблицей.

Const msiTransformErrorViewTransform = 256

Const msiOpenDB = 2

Dim FS, TS, WI, DB, View, Rec

Set WI = CreateObject("WindowsInstaller.Installer")

Set DB = WI.OpenDatabase(msiPath,msiOpenDB)

DB.ApplyTransform mstPath, msiTransformErrorViewTransform 

If Err.number Then 
    Exit Function 
End If

For i = 0 To 24 'Number of properties on the arrPropertyList

    Set View = DB.OpenView("Select `Value` From Property WHERE `Property` = " & "'" & arrPropertyList(i) & "'")
    View.Execute
    Set Rec = View.Fetch
    If Not Rec Is Nothing Then
        objLog.WriteLine arrPropertyList(i) & " = " & Rec.StringData(1)
    End If

Next

Этот код будет отображать свойства msiчто я добавил в arrPropertyList.Дело в том, что я ищу свойства MST и получаю только MSI.Я знаю, что должен изменить запрос для доступа к таблице _TransformView при вызове DB.OpenView, но не уверен, как мне получить эту информацию!Любые знания, которыми вы можете поделиться, приветствуются.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Это работает немного иначе, чем вы думаете. Выполните следующее, чтобы понять, что я имею в виду (возможно, вынудите VBS работать с Cscript.exe из командной строки, если вы ожидаете большой вывод):

'create 2 constants - one for when we want to just query the MSI (read) and one for when we want to make changes (write)

Const msiOpenDatabaseModeReadOnly = 0
Const msiOpenDatabaseModeTransact = 1
Const msiTransformErrorViewTransform = 256

'create WindowsInstaller.Installer object
Dim oInstaller : Set oInstaller = CreateObject("WindowsInstaller.Installer")

'open the MSI (the first argument supplied to the vbscript)
Dim oDatabase : Set oDatabase = oInstaller.OpenDatabase("C:\Temp\Temp.msi",msiOpenDatabaseModeReadOnly) 

oDatabase.ApplyTransform "C:\Temp\Temp.mst", msiTransformErrorViewTransform 

'create a view of the registry we want to see
Dim sql : sql = "SELECT * FROM `_TransformView`"
Dim regView : Set regView = oDatabase.OpenView(sql)

'execute the query
regView.Execute 

'fetch the first row of data (if there is one!)
Dim regRecord : Set regRecord = regView.Fetch

'whilst we've returned a row and therefore regRecord is not Nothing
While Not regRecord Is Nothing

    'print out the registry key
    wscript.echo "Table: " & regRecord.StringData(1) 
    wscript.echo "Column: " & regRecord.StringData(2) 
    wscript.echo "Row: " & regRecord.StringData(3) 
    wscript.echo "Data: " & regRecord.StringData(4)
    wscript.echo "Current: " & regRecord.StringData(5)
    wscript.echo "***"

    'go and fetch the next row of data  
    Set regRecord = regView.Fetch
Wend

regView.Close
Set regView = Nothing
Set regRecord = Nothing
Set oDatabase = Nothing
Set oInstaller = Nothing

Таким образом, если вы хотите видеть только изменения в таблице свойств, вы бы изменили SQL-запрос на:

Dim sql : sql = "SELECT * FROM `_TransformView` WHERE `Table` = 'Property'"

Помимо хранения имен столбцов измененных записей, столбец «Столбец» в таблице «_TransformView» также хранит, было ли значение вставлено, удалено и т. Д. С использованием значений: INSERT, DELETE, CREATE или DROP.

Вы можете найти множество учебных пособий по установщику Windows VBScript для справки - не забудьте установить для ваших объектов значение Nothing, иначе вы оставите дескрипторы открытыми. И, конечно, используйте ссылку , которую вы указали для дальнейшего использования.

0 голосов
/ 28 мая 2019

WiLstXfm.vbs : знакомы ли вы с примером MSI SDK: wilstxfm.vbs (Просмотреть преобразование)?Он может быть использован для просмотра файлов трансформации.Использование выглядит следующим образом:

cscript.exe WiLstXfm.vbs MySetup.msi MySetup.mst

Вывод макета :

Property Value           [INSTALLLEVEL] {100}->{102}
File DELETE              [Help.chm]

Я думаю, что все, что вам нужно, там?Может быть, быстро взглянуть на это.Существует множество таких примеров MSI API - для всех видов целей MSI.

Github.com / Windows SDK : этиVBScripts устанавливаются вместе с Windows SDK, поэтому вы можете найти их на локальном диске, если у вас установлена ​​Visual Studio, но вы также можете найти их на Github.com :

  • Github : WiLstXfm.vbs - репозиторий Microsoft на github.com .
  • Диск : На локальном диске выполните поиск в Program Files (x86), если у вас установлена ​​Visual Studio.Текущий пример: %ProgramFiles(x86)%\Windows Kits\10\bin\10.0.17763.0\x86.
...