C:\Windows\Installer越來越大?讓我們一起來刪除msp這個毒瘤


[技術] 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>1.jpg 

UpdateInfo以及UnblockAll了么?他們是安裝更新的關鍵所在!

用7zip打開對應的msi文件,找到Binary.UpdatesInfo然后解壓出來,並且改名成UpdatesInfo.vbs
然后用記事本打開這個vbs文件

<ignore_js_op>3.jpg 

在這里有一條非常重要的信息
  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>1.jpg 
OK,我們可以看到Office更新有33個,我們選擇前5個

<ignore_js_op>2.jpg 
下載完成,一共45MB更新

<ignore_js_op>3.jpg 
更新即將完成

OK 完成了
<ignore_js_op>4.jpg 
看,產生了76MB的MSP文件,我們先做個測試,直接刪除這些msp文件

然后再重新檢查Windows Update
<ignore_js_op>5.jpg 
發現直接刪除msp后 Office只有3個了,這明顯不正常,原先33個按道理安裝5個后更新這么說也會有28個的樣子吧,OK
我們吧刪除msp文件恢復回去  再來使用我寫的程序,清理注冊表,然后再刪除msp文件看看結果

<ignore_js_op>6.jpg 

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


身為一名強迫症患者,大家一起來折騰吧(●'◡'●)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM