使用 powershell 获得与添加/删除程序完全相同的应用程序列表

maj*_*tor 6 powershell

有多种方法可以在系统上查找已安装的应用程序,但据我所知,没有一种方法返回与控制面板项添加删除程序完全相同的列表。我尝试的一些方法是:

  • WMI 通过 Win32_Product 和 Win32Reg_AddRemovePrograms
  • 注册表,x32 和 x64 分支

例如,我在 AR 中有 217 个条目和

gwmi  Win32_Product
Run Code Online (Sandbox Code Playgroud)

返回 261 项。

gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | ? {![string]::IsNullOrWhiteSpace($_.DisplayName) } | select DisplayName
Run Code Online (Sandbox Code Playgroud)

返回 119 个项目。

 (gwmi Win32Reg_AddRemovePrograms) + (gwmi Win32Reg_AddRemovePrograms64) | sort DisplayName -Unique 
Run Code Online (Sandbox Code Playgroud)

返回 107 个项目。

我试着用更复杂的过滤器,包括钉下来InstallLocationInstallSourceInstallDate等没有成功。

Rya*_*ies 4

对我来说,这是康威定律的一个不幸的例子。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\...
Run Code Online (Sandbox Code Playgroud)

和更多!

一方面,可以准确地看到需要什么顺序的注册表查询来精确重建您在“添加/删除程序”中看到的内容,这是基于当前登录用户等的“视图”。 ,我想您很快就会意识到这是一项艰巨的工作,而且重建“添加/删除程序”的精确视图可能一开始对您来说并不那么重要。:)