Tenfk 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 最近遇到一个有趣的问题:当我试图使用wmi获取当前系统中已安装程序的列表时,却无法获取完整的列表。于是我做了进一步的研究,找到了错误的原因,改变了思路,达到了目的。 本文是基础知识介绍,用来解决基础问题。 0x01 简介 本文将介绍以下内容: 通过wmi获取当前系统中已安装程序的列表 wmi查询结果不完整的原因 获取完整节目单的实现思路 0x02 获取当前系统已安装的程序列表 1、使用powershell调用wmi 代码如下: get-wmio object-class Win32 _ Product 过滤输出结果,只显示程序名,代码如下: get-wmio Object-class Win32 _ Product | Select-Object-Property name 结果如下 2、使用wmic调用wmi 代码如下: wmic/命名空间:“\\root\CIMV2”路径Win32_Product 过滤输出结果,只显示程序名,代码如下: wmic/命名空间:“\\root\CIMV2”路径Win32 _ Product get name/FORMAT:table 结果如下 3、使用WMI Explorer调用wmi 下载地址: https://wmie.codeplex.com/releases/view/135794 接口wmi查询工具,可以用来查询wmi支持的类,是研究WMI的好工具。 首先单击“连接”来连接这台机器。 选择ROOT\CIMV2-Query。 输入查询命令: SELECT * FROM Win32_Product 结果如下 4、通过控制面板查询已安装的程序 控制面板-程序-程序和功能 发现的一些程序无法通过wmi查询获得,比如Google Chrome。比较结果如下。 0x03 wmi查询结果不完整的原因 通过WMI查询Win32_Product只能得到特定的程序列表。 这些程序有一个共同的特点:安装包由Windows Installer制作,安装过程中调用Windows Installer服务。 说明: windows installer:windows操作系统的一个组件,是安装和卸载软件的标准基础。 Windows Installer服务:添加、修改和删除作为Windows Installer软件包提供的应用程序。 除了微软的Windows Installer,还可以使用EasySetup、Setup2Go、Advanced Installer、Qt installer framework、WinRAR制作安装包。 Chrome在安装过程中不调用微软Windows Installer组件,所以无法通过WMI查询Win32_Product找到Chrome。 0x04 获取完整程序列表的实现思路 我们知道通过控制面板-程序-程序和功能得到的程序列表是比较完整的,列表对应的是注册表键值: HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \当前版本\卸载\ 每个孩子代表列表中的一个程序。 因此,通过枚举注册表项可以获得完整的程序列表。 值得注意的是,在64位系统下,注册表有重定向的问题,也会影响程序列表的显示。 32位程序列表对应于注册表项HKEY _本地_机器\软件\ wow6432node节点\微软\ windows \当前版本\卸载\ 64位程序列表对应于注册表项HKEY _本地_机器\软件\微软\ windows \当前版本\卸载 注: 这个问题在之前的文章《关于32位程序在64位系统下运行中需要注意的重定向问题》里整理过。 编写powershell脚本来枚举注册表并获得程序的完整列表。 关键代码: 1、枚举指定注册表项下的子项 目录注册表:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ Uninstall-Name 如下图 2、查询指定注册表项的注册表键值 (Get-item property-Path ' Registry:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ Uninstall \ { 4f 3742 e 0-700E-431d-BF19-5b 27 ed 98 E8 f 1 } ')。显示名称 如下图 3、加入foreach循环实现枚举 $ RegPath=' Registry:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ Uninstall ' $QueryPath=dir $RegPath -Name foreach($Name in $QueryPath) { (Get-item property-Path $ RegPath $ Name)。显示名称 } 4、加入判断系统位数,自动判断注册表重定向 完整代码请参考以下地址: https://github.com/3gstudent/ListInstalledPrograms 0x05 补充 通常,已安装的程序会创建快捷方式,因此您可以通过尝试枚举快捷方式文件来获得程序的完整列表。 通过wmic获取所有快捷方式: wmic路径Win32_ShortcutFile获取名称/格式:表 0x06 小结 介绍了无法通过wmi获取当前系统中已安装程序的完整列表的原因,编写powershell脚本,通过枚举注册表项来实现程序的完整列表。作为一篇介绍基础知识的文章,希望能给新人带来启发。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子