![使用 powershell 获取与添加/删除程序完全相同的应用程序列表](https://linux22.com/image/658663/%E4%BD%BF%E7%94%A8%20powershell%20%E8%8E%B7%E5%8F%96%E4%B8%8E%E6%B7%BB%E5%8A%A0%2F%E5%88%A0%E9%99%A4%E7%A8%8B%E5%BA%8F%E5%AE%8C%E5%85%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%88%97%E8%A1%A8.png)
有多种方法可以查找系统上已安装的应用程序,但据我所知,没有一种方法可以返回与控制面板项“添加删除程序”完全相同的列表。我尝试过的一些方法是:
- 通过 Win32_Product 和 Win32Reg_AddRemovePrograms 进行 WMI
- 注册表,x32 和 x64 分支
例如,我在 AR 中有 217 个条目,
gwmi Win32_Product
返回 261 个项目。
gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | ? {![string]::IsNullOrWhiteSpace($_.DisplayName) } | select DisplayName
返回 119 个项目。
(gwmi Win32Reg_AddRemovePrograms) + (gwmi Win32Reg_AddRemovePrograms64) | sort DisplayName -Unique
返回 107 个项目。
InstallLocation
我尝试使用包含、等更复杂的过滤器来确定它InstallSource
,InstallDate
但没有成功。
答案1
对我来说,这是一个不幸的案例康威定律。Windows 是一款非常复杂的操作系统,拥有数十年的历史和大量可移动部件。这意味着,一些看似简单的事情,比如问“我的电脑上都安装了什么?”,不幸的是,却变得非常复杂。使“已安装软件”变得复杂的原因是它来自几个不同的来源。有 64 位软件、32 位软件、仅为特定用户安装的软件、为所有用户安装的软件、通过组策略安装或分配给您的软件等等。
幸运的是,Sysinternal 的进程监视器可以向您揭示所有这些。只需启动它,监视注册表事件,然后自己单击“添加/删除程序”控制面板小程序,然后查看 Windows 在后台执行的操作。
它来自许多不同的来源:
HKLM\Software\Installer\Products
HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\...
HKCU\Software\Microsoft\Windows\CurrentVersion\Installer\Managed\...
HKCU\Software\Microsoft\Installer\Products
HKLM\Software\Microsoft\Windows\CurrentVersion\Group Policy\AppMgmt
HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\...
和更多!
一方面是可以准确地看到需要哪些注册表查询序列才能精确地重建您在“添加/删除程序”中看到的内容,这是基于当前登录用户的“视图”,等等。另一方面,我想你很快就会意识到这是一个很多工作,也许重建添加/删除程序的精确视图对你来说一开始可能并不那么重要。:)