有多种方法可以在系统上查找已安装的应用程序,但据我所知,没有任何方法返回与控制面板“添加删除程序”完全相同的列表。 我尝试的一些方法是:
例如,我在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个项目。
我试图用更复杂的filter,包括InstallLocation , InstallSource , InstallDate等没有成功。
对我来说,这是康威法则的一个不幸的例子。 Windows是一个非常复杂的操作系统,拥有数十年的历史和大量的移动部件。 这意味着什么似乎很简单,就像问“我的电脑上安装了所有的wtf”这个问题? 不幸的是很复杂。 使“安装的软件”变得复杂的事情是它来自几个不同的来源。 有64位软件和32位软件,仅为特定用户安装的软件,为所有用户安装的软件以及通过组策略安装或分配给您的软件等等。
幸运的是, Sysinternal的进程监视器可以向你显示这些信息。 只需启动它,监视registry事件,然后自己单击“添加/删除程序”控制面板小程序,并查看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\...
和更多!
一方面可以确切地看到需要什么序列的registry查询来精确地重build在“添加/删除程序”中看到的内容,这是基于当前login的用户的“视图”等。另一方面, ,我想你会很快意识到这是很多的工作,也许重新构build“添加/删除程序”的确切视图对于你来说可能并不重要。 🙂