[技术] C:\Windows\Installer越来越大?让我们一起来删除msp这个毒瘤

本帖最后由 zifeityzyicq 于 2013-11-20 12:05 编辑

你有没有发现C:\Windows\Installer这个文件夹下有很多msp文件,当然前提是你安装有Office等软件,而且安装了最新的补丁。

msp是一个二进制补丁文件,按照道理在安装更新后就就可以删除了,但是真的可以直接删除么?我们一起通过解包msi来得到答案。

温馨提示:本文给跟我一样的强迫症患者观看,如果你觉得你的系统盘有N个TB,完全不需要清理,那么请你离开,安安静静的看别的帖子,谢谢配合~~

msp文件占据了C:\Windows\Installer 目录很大的空间,但是。。。他们是不能直接删除的,直接删除那你就悲剧了,日后肯定N多更新无法安装

但是天无绝人之路,方法还是有的!可以实现彻底删除msp文件,而且不影响你安装以后的Office NET等补丁(温馨提示,删除后你将无法卸载对应的更新)

原理详解
一个可靠的方案必然有实现的原理,完成这个实验你需要准备一具”尸体“(一个msi文件),还有二把手术刀(7zip与ContextConsole Shell Extension)
7zip 我想不解释了,是世界上最强大的压缩软件之一,也是本人的最爱,大家应该也听说过
ContextConsole Shell Extension  基于Installer SDK开发的msi编辑工具,有了它我们就可以看到更多msi文件的内部信息

ContextConsole Shell Extension 打开一个msi文件转到Tables 的Binary
<ignore_js_op>

UpdateInfo以及UnblockAll了么?他们是安装更新的关键所在!

用7zip打开对应的msi文件,找到Binary.UpdatesInfo然后解压出来,并且改名成UpdatesInfo.vbs
然后用记事本打开这个vbs文件

<ignore_js_op>

在这里有一条非常重要的信息

  1. if(OldUpdsExists=ture) Then
  2. //***********************
  3. End If

复制代码

他的意思是如果 OldUpdsExists 为逻辑真 那么 *********************
看OldUpdsExists 的名字,我们可以猜测,他是判断旧的更新存在 的一个布尔值

OK,我们再来看看OldUpdsExists 到底是什么!

我们可以发现上一句

  1. OldUpdsExists=CheckIfKeyExists(HKCRProKey & ProduciCode &"\Patches\Patches")

复制代码

CheckIfKeyExists,意思其实很明白,检查对应的注册表是否存在!!而参数就是一个注册表路径

接下来我们来确定 HKCRProKey 以及 ProduciCode 这二个变量是什么,我可以可以猜测到他应该是注册表的路径

来吧在往上看就有了

  1. Const HKCRProKey =”HKLM\SOFTWARE\Classed\Installer\Products\“
  2. Const ProductCode="DC3BF90CC0D3D2F398A9A6D1762F70F3"

复制代码

这下我们明白了吧,他其实就是表示HKLM\SOFTWARE\Classed\Installer\Products\DC3BF90CC0D3D2F398A9A6D1762F70F3\Patches\Patches
这个注册表路径是否存在

而他存在的时候,就会进行一系列的验证操作,如果我们我们手动他这个注册表删除,然后再把msp文件删除,那是不是就可以跳过验证,立马进入更新安装了?

OK,我们来编写一段程序,来实现我们的操作(这种繁琐的事情自然交给程序去完成)
把所有的这样注册表删除
HKLM\SOFTWARE\Classes\Installer\Products\**********\Patches

然后再删除msp文件

C++实现代码

  1. HKEY Products = 0, Childkey = 0;
  2. wchar_t ChildKeyName[MAX_PATH];
  3. UINT ErrorCode = 0;
  4. if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Classes\\Installer\\Products", 0, KEY_READ | KEY_WRITE, &Products) == 0)
  5. {
  6. //打开注册表
  7. for (int i = 0; RegEnumKey(Products, i, ChildKeyName, MAX_PATH) == 0
  8. && (ErrorCode = RegOpenKey(Products, ChildKeyName, &Childkey)) == 0; i++)
  9. {
  10. //打开子键
  11. //然后删除Patches
  12. RegDeleteKeyW(Childkey, L"Patches");   //关闭
  13. RegCloseKey(Childkey);
  14. }
  15. //删除所有msp文件
  16. wchar_t *InstallPath = ChildKeyName;   //获得系统Install路径
  17. auto cchSystemRootStr = _tcslen(OsInfo->SystemRoot);
  18. memcpy(InstallPath, OsInfo->SystemRoot, cchSystemRootStr << 1);   memcpy(InstallPath + cchSystemRootStr, L"\\Installer\\*.msp", (_tcslen(L"\\Installer\\*.msp") + 1) << 1);
  19. cchSystemRootStr += 11;   WIN32_FIND_DATA FindFileData;
  20. auto hFileFind = FindFirstFile(InstallPath, &FindFileData);   if (hFileFind != INVALID_HANDLE_VALUE)
  21. {
  22. do
  23. {
  24. //InstallPath[cchSystemRootStr] = NULL;
  25. memcpy(InstallPath + cchSystemRootStr, FindFileData.cFileName, (_tcslen(FindFileData.cFileName) + 1) << 1);     //删除找到的msp文件     //取消只读属性
  26. SetFileAttributes(InstallPath, FILE_ATTRIBUTE_NORMAL);     if (DeleteFile(InstallPath) == 0)
  27. {
  28. ErrorCode = GetLastError();
  29. }    } while (FindNextFile(hFileFind, &FindFileData));    FindClose(hFileFind);
  30. }    if (ErrorCode)
  31. {
  32. //输出错误代码
  33. } }

复制代码

一起来做个测试吧,安装5个Office更新,对比直接删除msp文件与删除注册表后再删除msp文件的区别
<ignore_js_op> 
OK,我们可以看到Office更新有33个,我们选择前5个

<ignore_js_op> 
下载完成,一共45MB更新

<ignore_js_op> 
更新即将完成

OK 完成了
<ignore_js_op> 
看,产生了76MB的MSP文件,我们先做个测试,直接删除这些msp文件

然后再重新检查Windows Update
<ignore_js_op> 
发现直接删除msp后 Office只有3个了,这明显不正常,原先33个按道理安装5个后更新这么说也会有28个的样子吧,OK
我们吧删除msp文件恢复回去  再来使用我写的程序,清理注册表,然后再删除msp文件看看结果

<ignore_js_op>

OK,完美~~~
之后我又以每次5个Office更新为单位,还是循环  安装-清理  直到所有更新安装完成,一切正常

另外我还测试了6个可代替更新,也正常

谢谢观赏~~~~~~~~
如果你有能力,你可以自行做实验
逻辑很简单
第一步:删除所有这样的注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\***********\Patches
第二步:删除所有C:\Windows\Installer目录下的msp文件

另外这个特性将在下个版本的Dism管理器中实现,如果你是一名强迫症但又不会操作,你可以等待我的新版本
Dism管理器地址
http://bbs.pcbeta.com/viewthread-1423429-1-1.html

身为一名强迫症患者,大家一起来折腾吧(●'◡'●)

转载于:https://www.cnblogs.com/casa5040/p/5097382.html

C:\Windows\Installer越来越大?让我们一起来删除msp这个毒瘤相关推荐

  1. windows Installer(msiexec.exe)命令行选项

    Msiexec.exe用来解释和安装windows下的安装程序(*.msi) .以下适用与3.0以后的版本. 一 Msiexec.exe的标准命令行参数,区分大小写. Option Parameter ...

  2. windows系统C盘越来越大怎么办(包括win10)

    欢迎访问我的网站:omegaxyz.com 对于Mac电脑来说,不必太过担心垃圾清理.至于Windows用户电脑垃圾会越来越多.使用360和CCleaner已经满足不了用户的需求了.另外Win10在更 ...

  3. Windows服务器C盘越来越大的原因

    C盘越来越大的原因,一般有两个主要因素.一个是LOG文件持续增大.一个是Cotent.IE5文件夹文件太多.可以删除. Content.IE5的位置在: C:\Windows\SysWOW64\con ...

  4. c盘越来越大怎么清理?清理C:\Windows\System32\DriverStore\FileRepository

    c盘越来越大怎么清理? 装系统时划了50G给C盘,随着使用C盘的空间越来越小,该如何清理呢? 先解决2个基础软件设置造成的,为C盘腾出空间: 1.QQ 更换QQ文件存储路径.QQ设置->文件管理 ...

  5. Windows 10 文件夹越来越大,如何瘦身,删除哪些文件?

    Windows 10 文件夹越来越大,如何瘦身,删除哪些文件? 1,清除C盘临时文件 同时按住Windows键和R键 打开运行框输入"%temp%" 界面: 定位临时文件夹 删除所 ...

  6. c盘越来越大怎么清理?C:\Windows\System32\DriverStore\FileRepository

    c盘越来越大怎么清理? 查看全文 http://www.taodudu.cc/news/show-6531988.html 相关文章: c盘用户/user/AppData文件夹下无用文件删除 清楚C盘 ...

  7. C:\WINDOWS\Installer文件夹的安全清理

    这几天微软发布了不少补丁,系统盘(C:\)又开始空间告警. 没办法又要研究一下哪些空间是可以释放的,我的C:\分配了10G的空间,一度又一度的空间紧张,大家的系统盘是多大呢? 这一次我准备向 C:\W ...

  8. Windows Installer 3.1

    关键字:windows installer , windows server 2003 SP1 ,msi ,在2003上安装vs.net 2005 express beta 2 前天安装NUnit的时 ...

  9. 计算机c盘变大,如何解决Win10 C盘空间越来越大的问题?

    最近有部分用户说在系统安装不到两周的时间内,已经出现了系统磁盘占用逐渐增加的这类问题,甚至有时还会提示系统磁盘不足,对于这样的问题大家应该如何释放C盘占用空间呢?下面就请和小编一起来看下解决Win10 ...

最新文章

  1. ubuntu + oepncv + PCL + realsenseSDK + ROS + OpenVino开发环境搭建
  2. Google推出数据集搜索!百度,你怎么看?
  3. 树莓派悄悄放了个微软“后门”,系统加入微软源却未告知,用户怒了
  4. CodeSmith(2):对象和控制台
  5. 修改打印机ip工具_使用富士施乐一体机因动态IP导致不能打印与扫描的解决方法...
  6. Http(s)与后台交互方式
  7. 二、前端pink老师的CSS定位学习笔记(超详细,简单易懂)
  8. linux 从光盘安装数据,LINUX访问光盘数据
  9. C++ Coding Standard
  10. Python Socket(未编辑)
  11. 从源码分析常见的基于Array的数据结构动态扩容机制
  12. mysql CASE WHEN的基础和多种用法
  13. PAT (Basic Level) Practice1001 害死人不偿命的(3n+1)猜想
  14. Java开发笔记(一百四十七)通过JDBC管理数据库
  15. 中国500强企业是如何构建电子签章系统的?
  16. 阿里巴巴实习 面试题
  17. ccy_dlx 模块化与全局变量7-8ms
  18. 多路电源管理芯片(记录)
  19. 风铃机器码修改器2.2单进程单ID硬件信息用于解除机器码硬件修改大师多开器部分游戏
  20. 虚同步(Virtual Synchrony)核心文献

热门文章

  1. signalr中Group 分组群发消息的简单使用
  2. 利用缓冲流读取跟写入
  3. 漂亮、免费和响应式HTML5网站模板 - 转
  4. .Net的 Web项目的打包过程
  5. GroupCoordinator分析
  6. linux安装 gcc 7.2.0,centos7 安装 gcc-6.2.0
  7. (65)FPGA模块例化(parameter)
  8. (6)Zynq AXI_HP接口介绍
  9. 计算机系统中的总线,计算机系统中的总线控制器及其方法
  10. redhat6.3 安装 mysql_redhat6.3X64/linux 安装多个mysql(编译安装方法)