有多種方法可以查找系統上已安裝的應用程序,但據我所知,沒有一種方法返回與控制面板項目“添加刪除程序”完全相同的列表。我嘗試過的一些方法是:
- 透過 Win32_Product 和 Win32Reg_AddRemovePrograms 的 WMI
- 註冊表,x32 和 x64 分支
例如,我有 217 個 AR 條目,
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\...
和更多!
一方面它是可以準確地看到需要什麼順序的註冊表查詢來精確重建您在“添加/刪除程序”中看到的內容,這是基於當前登錄用戶等的“視圖”。快就意識到這是一個很多工作量,也許重建「新增/刪除程式」的精確視圖對於您來說可能並不是那麼重要。 :)