Windows安装程序如何从内部工作

时间:2015-10-26 10:40:57

标签: windows-installer installshield

我已经工作了3天了解Windows安装程序的工作原理?在开始一个新的AutoIT脚本编写Job之前,我应该回答这是一个很大的问题。也许你们很多人认为我不需要这些信息,因为我只使用msiexec工具和正确的选项但是对我来说知道怎么做很重要当我遇到msi错误时,它从内部工作,有一个坚实的理论基础。 在这3天里我学到了很多东西。我已经知道MSI是包含内部源文件(图标,ini文件,语言文件,配置文件,exe文件,注册表项等)的文件格式,最重要的是它包含Relational DataBase。我知道每个产品都有一个GUID,每个产品都由许多具有GUID的组件组成。所有安装顺序也存储在MSI数据库中(每个序列和执行条件都有表)。现在来到我坚持的地步。我认为Windows安装程序应该在目标机器上的某种存储库中保留一些信息(将在其上安装软件)我不知道在哪里可以找到这个存储库以及如何从中获取信息。例如,我想知道: - 计算机上已安装的MSI产品是什么(产品的所有GUID列表)。 - 计算机上已安装的组件是什么(所有GUID列表)? - 在安装过程中执行的步骤或操作是什么?(我想可能有一个日志文件描述了隐藏在本地计算机某处的安装步骤)?也许有一个MSI数据库的副本将作为日志文件存储在本地计算机上,用于描述安装顺序!! - 源文件在目标计算机上复制的位置?

我已经完成了一些测试安装以检查一些注册表项,但在安装完成后我没有发现有新的注册表项! 这是我检查过的地方 HKEY_CLASSES_ROOT \安装 HKEY_CURRENT_USER \ SOFTWARE \微软\安装 HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ Installer程序

最后的解决方案我使用过程监视器,然后使用RegShot工具和我 已保存的日志文件有关添加的新注册表和监视进程msiexec(请参阅下面的链接)我用于启动安装的MSI文件属于7-ZIP工具。

Result of comparison between the registry database before the installation and after the installation

msiexec process monitor during installation(accessible only with Processor Monitor tool)

对于人们如何能帮助我,我将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

当有API可以满足您的需求时,尽量避免猜测实现细节。尽管如此,我还不清楚你的目标是什么,所以我会给出简洁的起点答案,你可以酌情跟进更有针对性的问题。 (注意:下面链接的许多C ++ API在Windows Installer Automation Interface上都有其他名称。我不是专家,所以我省略了这样的链接。)

  

计算机上已安装的MSI产品是什么(产品的所有GUID列表)。

使用MsiEnumProductsMsiEnumProductsEx(后者支持查询其他用户的每个用户安装)来查找此内容。

  

计算机上已安装的组件是什么(所有GUID列表)?

使用MsiEnumComponentsMsiEnumComponentsEx(后者支持查询其他用户的每个用户安装)来查找此内容。

  

在安装过程中执行的步骤或操作是什么?

未存储。组件状态(MsiQueryComponentState)"应该"告诉你足够的东西,以确定应该在那里,并在失踪时修复它。

  

也许有一个MSI数据库副本将作为日志文件存储在本地计算机上以描述安装顺序!!

不是日志文件,而是将数据库复制到缓存目录(MsiQueryProductInfo(..., INSTALLPROPERTY_LOCALPACKAGE, ...))。它应该在该位置被认为是只读的。

  

源文件是否在目标计算机上复制?

他们可能存在也可能不存在。使用MsiSourceListEnumSourcesMsiQueryProductInfo(..., INSTALLPROPERTY_INSTALLSOURCE, ...)查询(后者应该告诉您原始位置,但理论上可能已从源列表中删除)。