Как Windows находит установленное местоположение при удалении программного обеспечения - PullRequest
1 голос
/ 11 февраля 2020

Когда я запускаю установщик, который разрешает настраиваемое расположение / путь установки, файлы будут правильно помещаться в выбранное мной местоположение.

Когда я запускаю тот же MSI и выбираю удалить (или удалить из добавления / удалить программы), как он узнает место установки, чтобы удалить правильные файлы?

Я думал, что он будет храниться в 'Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall {GUID}' , но когда я смотрю на это место для моего установленного программного обеспечения, ключ 'InstallLocation' пуст .

Однако, как бы я его не удалял, он знает, в какую папку go удалите, где бы я ни положил. Эта информация хранится в другом месте в реестре или в самом файле MSI?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Это очень сложный вопрос, поскольку MSI можно настроить так, чтобы он удалял свои файлы деинсталляции в любом месте, где вы им скажете. Обычно по умолчанию создается файл для удаления .msi с указанным c именем в C: \ Windows \ Installer.

Но не зависит от удаления. msi находится в этом каталоге и не полагайтесь на наличие пути удаления в разделе реестра Uninstall. Этот ключ так же удобен для конечного пользователя, как и все остальное.

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

Добавление еще нескольких вещей ... многим установщикам, таким как Nullsoft, InstallAware и InstallShield, нравится заниматься своими делами. и поместите их информацию об удалении в других местах. Поэтому InstallShield любит создавать папку с информацией об установке InstallShield, а Nullsoft любит создавать файлы .dat и uninstall.exe. Но помимо всего этого, эти установщики все еще вызывают MSI и создают установочные таблицы и базу данных. Поэтому, где фактически находится информация для удаления, это не точная наука!

0 голосов
/ 15 февраля 2020

Детали реализации : Как 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)

Ссылки :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...