我们发现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文件
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) { //输出错误代码 } } |
文章来源:
网络小编D
版权声明:
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站立刻删除。
