程序安装后在注册表中生成的安装信息解析

2024-03-27 12:48

本文主要是介绍程序安装后在注册表中生成的安装信息解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序安装后在注册表中生成的安装信息解析

经常碰到程序无法卸载, 就老是骂微软搞的什么安装方式,安装好了不能卸载.

后来就打算研究一下windows是如何卸载程序的,一个程序安装完后留下了什么信息用于后面的卸载.

研究对象win7 64位, 程序npviewinie.

程序安装后生成的最主要的注册表项是在以下三个中

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall     64位程序

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall   32位程序

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall    安装到当前用户的程序,安装时不需要管理员权限

比如HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{43DCBFFE-81BE-4077-8F84-E32DB69C6979}

{43DCBFFE-81BE-4077-8F84-E32DB69C6979}是程序的唯一ID,固定的,在{43DCBFFE-81BE-4077-8F84-E32DB69C6979}里有程序的概要信息,比如:

DisplayName: npviewinie    程序名字,如果为空则不会显示在卸载程序列表里面

InstallLocation: D:\Program Files\npviewinie\   程序安装位置

UninstallString:  MsiExec.exe /X{43DCBFFE-81BE-4077-8F84-E32DB69C6979}   程序卸载命令

如果安装信息全都放在这里那就简单了,可是微软搞的很复杂,它把这里当成索引,在其他地方放了其他的东西.

其他地方保存了程序的相关信息,主要有以下几处:

# => HKEY_CLASSES_ROOT\Installer\Components 
# => HKEY_CLASSES_ROOT\Installer\Features 
# => HKEY_CLASSES_ROOT\Installer\Patches 
# => HKEY_CLASSES_ROOT\Installer\Products 
# => HKEY_CLASSES_ROOT\Installer\UpgradeCodes

# => HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components 
# => HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products 
#=> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes

# => HKEY_CURRENT_USER\Software\Microsoft\Installer\Features 
# => HKEY_CURRENT_USER\Software\Microsoft\Installer\Products 
# => HKEY_CURRENT_USER\Software\Microsoft\Installer\UpgradeCodes

看吧,复杂吧,其中联系它们在一起的是那个唯一ID,而且是压缩过,比如刚才那个压缩成了EFFBCD34EB187704F8483ED26BC99697.

其中有几个比较重要的需要提一下:

在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\EFFBCD34EB187704F8483ED26BC99697\InstallProperties下

LocalPackage: C:\Windows\Installer\1645971.msi

这个C:\Windows\Installer\1645971.msi就是卸载包的位置,如果这个丢了(网上的精简系统方法可能会涉及到这个),那么卸载失败的机会就降了一半.

另一半的机会在安装包还存在的情况.安装包的名字记录在:

HKEY_CLASSES_ROOT\Installer\Products\EFFBCD34EB187704F8483ED26BC99697\SourceList

PackageName: npviewinie_zh_1.6.6.msi

位置记录在:

HKEY_CLASSES_ROOT\Installer\Products\EFFBCD34EB187704F8483ED26BC99697\SourceList\Net

1: E:\code\npviewinie\doc\Install\1.6.6\

位置不正确不要急,因为它找不到就会让你选择位置的.

 

总结:

1. 不要随便动C:\Windows\Installer目录下的东西,虽然它越来越大

2. 能用正常卸载最好

3. 如果不能正常卸载,在强制卸载的时候,最好找到所有注册表然后一起删除,尤其不要忘了那个在C:\Windows\Installer下的文件.

如果手动查找麻烦,那么建议只删除那个主要注册表,然后再重装一次软件,再删除.

4. 上面关于强制卸载时用重装软件的建议有一个小问题,在重装软件之后,所有的注册表跟之前是一样的,但有个东西不一样,那就是在C:\Windows\Installer目录下的文件名,这样就导致之前的那个文件完全失去了联系.真的成为了孤魂野鬼.

5.还有一种方法.我写了一个脚本来强制删除这些注册表和文件,需要会运行脚本的人,脚本使用附录有介绍.

 

附录:

1. npviewinie程序从注册表中获取的所有相关注册表和文件信息

安装目录: D:\Program Files\npviewinie\ 
安装文件目录: E:\code\npviewinie\doc\Install\1.6.6\ 
卸载命令: MsiExec.exe /X{43DCBFFE-81BE-4077-8F84-E32DB69C6979} 
主要注册表路径: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{43DCBFFE-81BE-4077-8F84-E32DB69C6979} 
卸载文件路径: C:\Windows\Installer\1645971.msi 
安装包文件路径: E:\code\npviewinie\doc\Install\1.6.6\\npviewinie_zh_1.6.6.msi 
其他相关注册表: 
HKEY_CLASSES_ROOT\Installer\Features\EFFBCD34EB187704F8483ED26BC99697 
HKEY_CLASSES_ROOT\Installer\Products\EFFBCD34EB187704F8483ED26BC99697 
HKEY_CLASSES_ROOT\Installer\UpgradeCodes\D970B879D13D71644B1842FAEEAD2150 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes\D970B879D13D71644B1842FAEEAD2150
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\EFFBCD34EB187704F8483ED26BC99697 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\00DA8AC25B115D14E82A2D938699DD78 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\0C86DB1A2A425AA4ABDD342F238B3D58 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\439BCBF3DBE6C264F8A83C86B199B574 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\7B6F588AB8E7D4F4EB92A12CB7A8EB7C 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\8BAFF9E2E57CD2E409B6A3B513EAABD0 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\A02CBC3755662E04EA045A3ECE68D2AF 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\AD2FEFFDA9B68E44AA18B440BA31F000 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\CC166F7311E02514B80CC34BF06B5DE8

2.脚本介绍

脚本下载地址: http://pan.baidu.com/s/1c0rMeuG

其中:

list_all_installed_program.rb 可以列出所有安装的程序的名字

check_installed_program_health.rb 程序名    可以检查程序是否可以卸载或程序是否还存在

check_installed_program_health.rb -v 程序名 可以查看程序的相关信息

check_installed_program_health.rb -d 程序名 可以删除程序的相关信息,包括程序目录,卸载包,所有注册表

您可以任意转载本文,但转载时请勿删除作者信息。 
作者:hgyxbll,原文链接: http://shashanzhao.com/archives/1031.html

这篇关于程序安装后在注册表中生成的安装信息解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852149

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图