冗余 Windows Installer 文件的清理 对于使用 Windows Installer 技术制作的安装程序,我一向不是那么的喜好,即使 Windows Installer 技术有着非常优秀的功能、稳定的性能以及其他值得骄傲的特性。 究其原因,是因为使用 Windows Installer 技术制作的安装程序会在 %systemroot%/Installer 目录里面 添加一个备份的安装文件用于今后的配置、补丁安装等操作。不可否认的是,在系统里面存放一个安装程序的备份,是一件非常理想的事情,尤其是对于那些经常丢 失安装程序的用户来说。对于这一点,我倒是非常的赞赏。但是,有一个功能我的确难以理解:当用户运行一个补丁程序的时 候,Windows Installer 将msp文件释放到 %systemroot%/Installer 目录以后,开始引导用户进行补丁的安装。 如果用户在引导的时候点击了取消操作或补丁安装必备条件不足而导致安装失败的时候,Windows Installer 将退出安装流程,但是会把释放 到 %systemroot%/Installer 目录里面的msp文件保留下来。如果用户再次运行同一个补丁程 序,Windows Installer 又会在 %systemroot%/Installer 目录里面生成一个新的msp文件(文件名和上一次的不 同),而不会利用上一次释放产生的msp文件。这样一来,第一次产生的msp文件将会永久的存留在磁盘上,成为彻底的无用文件。 为了解决这个问题,我决定找回被Windows Installer无用文件占用的磁盘空间。对 Windows Installer 补丁技术 研究以后发现,如果补丁安装成功,会在注册表里面记录一个信息,当新的增量补丁程序需要旧的补丁程序的时候,会在注册表里面寻找旧的信息,并找到旧的 msp文件,然后就是补丁文件的整合以及修补过程。具体的步骤比较复杂,这里不予多说。我们需要的是 将 %systemroot%/Installer 目录里面无用的文件挑选出来,其他的流程和本次主题无关。 冗余MSP文件清除原理: 1、MSP安装完成以后,会在注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows /CurrentVersion/Installer/UserData/S-1-5-18/Patches 下面生成一个键。键名是一个32字节的 GUID值,生成的键下会有一个键值,名称固定为 LocalPackage 用于指向本地的 MSP 文件的路径。 2、记录下每一个键下的 LocalPackage 指向的文件的文件路径。 3、然后打开 %systemroot%/Installer 目录,将这个目录根目录下的所有 MSP 文件挑出,除去在第2步中存在的文件名,剩下的MSP文件就是冗余的文件。 *注: S-1-5-18指 Local System 用户,大多数补丁都是以 S-1-5-18 安装的。 |