安全的删除C:\Windows\Installer文件夹方法,删除msp的正确方法

迅恒数据中心
我们发现C:\Windows\Installer这个文件夹下有很多msp文件,当然前提是你安装有Office等软件,而且安装了最新的补丁。
msp是一个二进制补丁文件,按照道理在安装更新后就就可以删除了,但是真的可以直接删除么?我们一起通过解包msi来得到答案。
msp文件占据了C:\Windows\Installer 目录很大的空间,但是。。。他们是不能直接删除的,直接删除那你就悲剧了,日后肯定N多更新无法安装
怎么安全彻底删除msp文件呢,而且不影响你安装以后的Office NET等补丁(温馨提示,删除后你将无法卸载对应的更新)
安全删除原理详解:
一个可靠的方案必然有实现的原理,完成这个实验你需要准备一具”尸体“(一个msi文件),还有二把手术刀(7zip与ContextConsole Shell Extension)
逻辑很简单
第一步:删除所有这样的注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\***********\Patches
第二步:删除所有C:\Windows\Installer目录下的msp文件
 HKEY Products = 0, Childkey = 0;
 wchar_t ChildKeyName[MAX_PATH];
 UINT ErrorCode = 0;
 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Classes\\Installer\\Products", 0, KEY_READ | KEY_WRITE, &Products) == 0)
 {
  //打开注册表
  for (int i = 0; RegEnumKey(Products, i, ChildKeyName, MAX_PATH) == 0
   && (ErrorCode = RegOpenKey(Products, ChildKeyName, &Childkey)) == 0; i++)
  {
   //打开子键
   //然后删除Patches
   RegDeleteKeyW(Childkey, L"Patches");   //关闭
   RegCloseKey(Childkey);
  }  
   //删除所有msp文件
   wchar_t *InstallPath = ChildKeyName;   //获得系统Install路径
   auto cchSystemRootStr = _tcslen(OsInfo->SystemRoot);
   memcpy(InstallPath, OsInfo->SystemRoot, cchSystemRootStr << 1);   memcpy(InstallPath + cchSystemRootStr, L"\\Installer\\*.msp", (_tcslen(L"\\Installer\\*.msp") + 1) << 1);
   cchSystemRootStr += 11;   WIN32_FIND_DATA FindFileData;
   auto hFileFind = FindFirstFile(InstallPath, &FindFileData);   if (hFileFind != INVALID_HANDLE_VALUE)
   {
    do
    {
     //InstallPath[cchSystemRootStr] = NULL;
     memcpy(InstallPath + cchSystemRootStr, FindFileData.cFileName, (_tcslen(FindFileData.cFileName) + 1) << 1);     //删除找到的msp文件     //取消只读属性
     SetFileAttributes(InstallPath, FILE_ATTRIBUTE_NORMAL);     if (DeleteFile(InstallPath) == 0)
     {
      ErrorCode = GetLastError();
     }    } while (FindNextFile(hFileFind, &FindFileData));    FindClose(hFileFind);
   }    if (ErrorCode)
  {
   //输出错误代码
  } }

分类:安全公告 百度收录 必应收录