"Intent"
我们在部署中遇到一些问题,人们告诉我们这些问题是什么doing,但不是它们是什么打算. 有时这会导致我们写出详尽的答案,但无法回答问题。我希望这里的情况不是这样。
尝试回答
您想要找到安装期间缓存的 MSI 的确切路径,如下所示:%SystemRoot%\Installer
在安装 MSI 期间?
我从来没有尝试过,但是萨沙·博蒙特很久以前发布了一个VBScript,它似乎尝试做你想做的事情(尽管不是在安装过程中):WiX 自定义操作 - MSI 复制自身 https://stackoverflow.com/questions/11470760/wix-custom-action-msi-copy-itself。我从未尝试过这个脚本,也不想推荐它。
关于 C++ redist 的东西:我不确定他们到底在做什么,但微软倾向于一直重写他们自己的规则,他们做了一些事情 -
有时 - 分析时毫无意义。我不会花太多时间去理解它——除非你绝对必须这么做。只是我的2分钱。
我们可以问一个显而易见的问题吗:你为什么需要这份副本? 也许有更好的方法来实现你想要的?下面是用于缓存 MSI 文件的不同文件夹的简要概述以及一些包含 MsiSetExternalUI 信息的链接。
MsiSetExternalUI
我不明白您需要如何像您尝试的那样访问日志MsiSetExternalUI
来实现 MSI 文件缓存,但这里有一些使用链接:
-
使用 MsiSetExternalUI 进行日志记录和过滤 https://serverfault.com/a/615256/20599(serverfault.com)。
-
包装 Windows Installer 2.0 API http://www.codeproject.com/KB/cs/msiinterop.aspx.
-
使用 MsiSetExternalUI 处理进度消息 https://msdn.microsoft.com/en-us/library/aa368786(v=vs.85).aspx.
有关 MSI 缓存的更多信息
有MSI 缓存的几种形式- 一些内置于 Windows Installer 中,另一些由第三方工具实现,某些 Microsoft 工具有自己的部署方式(例如视觉工作室).
以下是有关如何在系统上缓存 MSI 文件的一些提示。这绝不是完整的,但这是我可以写下的:
1. Windows Installer (msiexec.exe) 缓存
有一个内置的 Windows Installer 功能可以在安装过程中缓存原始 MSI 安装数据库的副本。该缓存副本过去被删除了内部 CAB 文件(使它们比原始文件小得多),但是这在 Windows 7 周围发生了变化,MSI 副本现在以全尺寸缓存 https://stackoverflow.com/questions/208530/why-does-msi-require-the-original-msi-file-to-proceed-with-an-uninstall/1189524#1189524(点击链接了解详情)。
缓存 MSI 的文件夹是:%SystemRoot%\Installer
(通常是 C:\Windows\Installer)。每个 MSI 都分配有一个随机的十六进制名称。所有 MSI 文件都将进入此缓存文件夹 - 除非在安装或产品注册过程中出现问题。此文件夹中缺少 MSI 文件是一个严重的问题 - 该产品通常无法卸载,也无法升级。我们开始看到某些安全软件从该文件夹隔离 MSI 文件的问题 - 处理起来可能是一场噩梦 - 但这不是这个答案的重点。
除了这个内置机制之外,第三方供应商可能会将原始安装 MSI 缓存在其他位置以及这个内置的缓存文件夹。这是为了支持修复、修补和修改操作,而不需要任何“源媒体”请求。非常适合家庭和小型办公室用户,但企业用户可能不会欣赏它,因为他们在可从所有工作站访问的网络共享上提供了所有安装源(他们不喜欢此类本地副本)。为了实现这一点,他们通常使用MSI 的内置管理安装功能 https://stackoverflow.com/questions/5564619/what-is-the-purpose-of-administrative-installation-initiated-using-msiexec-a/5751980#5751980- 本质上是创建网络位置共享的标准化方法,以通过提取的文件触发安装(有一个这里是管理设施的另一个描述 https://stackoverflow.com/questions/1547809/extract-msi-from-exe/24987512#24987512- 也许比第一个更注重实用)。
UPDATE: 说实话,我觉得源文件的可选缓存应该从一开始就内置到 Windows Installer 中并成为默认命令行选项(对于家庭和小型办公室用户),然后一个简单的标志就可以轻松地阻止所有企业用户进行此类缓存(例如 NOSOURCECACHING = 1)。还:现在 MSI 文件已全尺寸缓存在 %SystemRoot%\Installer 中 https://stackoverflow.com/questions/208530/why-does-msi-require-the-original-msi-file-to-proceed-with-an-uninstall/1189524#1189524- 看来你仍然无法从那里自动神奇地获取源文件? (最近没有测试)。这是怎么回事?文件就在那里 - 除非安装是通过管理映像进行的(在这种情况下,源可能安全地位于网络共享上,并且在需要时可以访问,从而可以避免本地 PC 混乱)。哦,好吧,将来我们无疑将按需直接从在线存储库中提取文件,这样一个问题就解决了,并且一系列新问题正在酝酿之中?恶意软件、欺骗和注入?远程文件在没有警告的情况下被删除(以摆脱不应再使用的易受攻击的版本 - 让用户陷入困境)?证书和签名有问题吗?防火墙和代理问题?自动魔法更新中不幸的错误会立即影响到每个人吗?只是咆哮:-)。我确信这将在很大程度上得到改善。无论如何,下面的部分将介绍当前的第三方缓存方法(非 MSI 标准)。
2.WiX缓存
WiX 捆绑功能(刻录)可以在系统上缓存 MSI 文件。说实话,我不是 100% 确定他们是如何做到这一点的,我希望Arnson or 门兴 can 如果我错了请在这里纠正我。然而,我相信他们使用:%ProgramData%\Package Cache
(通常是 C:\ProgramData\Package Cache)用于缓存。我的系统上有很多不同的 Microsoft 组件,我不确定它们是否都与 WiX 一起打包。
3.安装shield缓存
Installshield可以将原始MSI文件缓存在%SystemRoot%\Downloaded Installations
对于某些类型的构建配置。换句话说:并非所有 Installshield 设置都会以这种方式缓存自身 - 这是一个 Installshield 项目构建设置,可以根据设置开发人员的需要打开或关闭。
UPDATE:似乎较新版本的 Installshield 现在可以默认缓存设置%LocalAppData%\Downloaded Installations
(通常是 C:\Users\YOURUSERNAME\AppData\Local\Downloaded Installations)而不是%SystemRoot%\Downloaded Installations
。我不确定哪个版本切换到了这个位置。或许迈克尔·厄曼 https://stackoverflow.com/users/89999/michael-urmanInstallshield可以帮助我们吗?
4. 高级安装程序缓存
添加者博格丹·米特拉什 https://stackoverflow.com/users/882875/bogdan-mitrache高级安装程序(非常感谢 - 现在它是准确的):从高级安装程序构建的 EXE 获取/复制 MSI 的最简单方法是使用/extract
命令行选项 https://www.advancedinstaller.com/user-guide/exe-setup-file.html.
在安装时,对于 EXE 构建(MSI 捆绑在 EXE 内) 高级安装程序默认在此位置提取内容:
[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install
.
如您所见,它取决于供应商,因此每个包的路径都不同。
此外,该路径可以在安装项目中自定义,因此用户可以更改它(大多数时候他们不).
安装完成后还可以选择删除提取的资源,这也是用户可配置的并且默认情况下处于启用状态。
如果您使用高级安装程序构建标准 MSI,则缓存由 Windows Installer 完成,如上所述。
5.Visual Studio 缓存
Visual Studio appears to cache packages under: %AllUsersProfile%\Microsoft\VisualStudio\Packages
(normally C:\ProgramData\Microsoft\VisualStudio\Packages). I don't really have a clue how they do things apart from this folder being used. There are also packages here:
%ProgramData%\Microsoft\VisualStudio\Packages
.
UPDATE: the folder %ProgramData%\Microsoft\VisualStudio\Packages
appears to be the same location as above (%AllUsersProfile%\Microsoft\VisualStudio\Packages
) only with a symbolic link (the folders point to the same files and folders on disk). It is also possible to disable this caching as described by Heath Stewart here: Moving or disabling the package cache for Visual Studio 2017 https://blogs.msdn.microsoft.com/heaths/2017/04/17/moving-or-disabling-the-package-cache-for-visual-studio-2017/.
这是非 MSI 并且我不熟悉:%ProgramFiles(x86)%\Microsoft SDKs\NuGetPackagesFallback
6. 其他缓存文件夹?
Apple:我对此了解不多,但似乎 Apple 可能会使用此文件夹来缓存一些 MSI 安装程序:%LocalAppData% \Apple\Apple Software Update\
(通常为 C:\Users\Acer\AppData\Local\Apple\Apple Software Update)。
Sun:Sun 似乎使用此基本文件夹来缓存 Java 安装 MSI 文件:%UserProfile%\AppData\LocalLow\Oracle\Java
(通常为 C:\Users\Acer\AppData\LocalLow\Oracle\Java)。
毫无疑问,还有许多其他缓存文件夹正在使用。