Детали реализации : Как MSI хранит эти вещи, это детали реализации, к которым не следует вмешиваться, пытаться их модифицировать или использовать напрямую для каких-либо целей - просто, чтобы было ясно. Вы должны go через MSI API , который реализован как Win32-функции с дополнительными COM-оболочками для доступа через языки сценариев.
Реестр : База данных MSI хранится в основном в реестре, но также есть компоненты на диске, некоторые из которых вы ссылаетесь, например, %SystemDrive%\Windows\Installer
(a супер-скрытая папка, которая не должна изменяться каким-либо образом). База данных MSI хранится в разных местах по всему реестру:
HKCR\Installer
HKCU\Software\Microsoft\Installer
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Installer
Etc...
Некоторые из них являются реальными, некоторые являются псевдонимами, некоторые являются слияниями. Это все немного нечетко. Опять же: implementation details
- всем нам всем известен эвфемизм: « сейчас же сдавайся, »? :-). Просто примените MSI API, чтобы получить необходимую информацию.
MSI API : много материала для прочтения выше, чтобы добраться до сути, go через MSI API, чтобы получить информацию о разрешении каталогов. Что нам нужно сделать, это немного exoti c, нам нужно раскрутить объект сеанса для установленного продукта и запустить два стандартных действия (встроенные действия MSI от Microsoft), чтобы разрешить таблицу каталогов и каталоги установки MSI в вопросе ( о «стоимости» ). Ниже приведен практический пример:
Для записи:
Set installer = CreateObject("WindowsInstaller.Installer")
productcode = Trim(InputBox("Please paste or type in the product code you want to look up details for:", _
"Find Product Details (test GUID provided):", "{766AD270-A684-43D6-AF9A-74165C9B5796}"))
If search = vbCancel Or Trim(productcode) = "" Then
WScript.Quit(0)
End If
Set session = installer.OpenProduct(productcode)
' Crucially, resolve the directory table and properties by running "MSI Costing"
session.DoAction("CostInitialize")
session.DoAction("CostFinalize")
' Can be any directory property from the Directory table in the MSI:
MsgBox session.Property("INSTALLFOLDER")
' Open the MSI in Orca to find the directory folder property names
Добавив ссылку на старый ответ на , как составить список таблиц в файле MSI .
Разрешить все : получил немного увлекся и сделал еще одно обновление для разрешения ВСЕХ каталогов для любого установленного пакета. Вот сценарий (не проверено много):
' https://stackoverflow.com/questions/17543132/how-can-i-resolve-msi-paths-in-vbscript
' On Error resume Next
Set installer = CreateObject("WindowsInstaller.Installer")
const READONLY = 0
Dim DirList
productcode = Trim(InputBox("Please paste or type in the product code you want to look up details for:", _
"Find Product Details (test GUID provided):", "{766AD270-A684-43D6-AF9A-74165C9B5796}"))
If search = vbCancel Or Trim(productcode) = "" Then
WScript.Quit(0)
End If
Set session = installer.OpenProduct(productcode)
session.DoAction("CostInitialize")
session.DoAction("CostFinalize")
set view = session.Database.OpenView("SELECT * FROM Directory")
view.Execute
set record = view.Fetch
Do until record is Nothing
ResolvedDir = session.Property(record.StringData(1))
DirList = DirList + record.StringData(1) + " => " + ResolvedDir + vbCrLf
set record = view.Fetch
Loop
' Dismiss dialog with ESC key if it falls off screen
WScript.Echo DirList ' Use WScript.Echo due to MsgBox restrictions (number of characters)
Ссылки :