使用軟體安裝
透過 WMI 的查詢可以找到隨 Windows Installer 一起安裝的應用程式,但並非所有應用程式都使用 Windows Installer。 尋找與其他工具一起安裝之應用程式的特定技術取決於安裝程序軟體。
例如,藉由將檔案複製到計算機上的資料夾所安裝的應用程式,通常無法使用此處討論的技術來管理。 您可以使用使用檔案和資料夾中所述 的技術,將這些應用程式管理為檔案和資料夾。
對於使用安裝程式套件安裝的軟體,可以使用 Win32Reg_AddRemovePrograms 或 Win32_Product 類別找到 Windows Installer。 不過,這兩者都有問題。 只有在您使用 System Center Configuration Manager (SCCM) 時,才能使用Win32Reg_AddRemovePrograms。 而且Win32_Product類別可能很慢,而且有副作用。
警告
Win32_Product 類別未優化查詢。 使用通配符篩選的查詢會導致 WMI 使用 MSI 提供者列舉所有已安裝的產品,然後循序剖析完整清單來處理篩選。 這也會起始已安裝之套件的一致性檢查,並驗證並修復安裝。 驗證是緩慢的程式,而且可能會導致事件記錄檔發生錯誤。 如需詳細資訊,請參閱 知識庫文章974524。
本文提供尋找已安裝軟體的替代方法。
查詢卸載登錄機碼以尋找已安裝的軟體
由於大部分的標準應用程式會向 Windows 註冊卸載程式,因此我們可以在 Windows 登錄中找到這些卸載程式,在本機使用這些應用程式。 不保證可以在系統上尋找每個應用程式。 不過,您可以在下列登錄機碼的 [新增] 或 [移除程式] 中找到所有列表的程式:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
.
我們可以藉由計算登錄機碼數目來尋找已安裝的應用程式數目:
$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count
459
我們可以使用各種技術進一步搜尋此應用程式清單。 若要在的登錄機碼中 Uninstall
顯示登錄值的值,請使用 GetValue()
登錄機碼的方法。 方法的值是登錄項目的名稱。 例如,若要在機碼中 Uninstall
尋找應用程式的顯示名稱,請使用下列命令:
Get-ChildItem -Path $UninstallPath |
ForEach-Object -Process { $_.GetValue('DisplayName') } |
Sort-Object
注意
不保證 DisplayName 值是唯一的。
下列範例會產生類似 Win32Reg_AddRemovePrograms 類別的輸出:
Get-ChildItem $UninstallPath |
ForEach-Object {
$ProdID = ($_.Name -split '\\')[-1]
Get-ItemProperty -Path "$UninstallPath\$ProdID" -ea SilentlyContinue |
Select-Object -Property DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
} | Select-Object -First 3
為了簡潔起見,這個範例會使用 Select-Object
來限制傳回三個專案的數目。
DisplayName : 7-Zip 22.01 (x64)
InstallDate :
ProdID : 7-Zip
Publisher : Igor Pavlov
DisplayVersion : 22.01
DisplayName : AutoHotkey 1.1.33.10
InstallDate :
ProdID : AutoHotkey
Publisher : Lexikos
DisplayVersion : 1.1.33.10
DisplayName : Beyond Compare 4.4.6
InstallDate : 20230310
ProdID : BeyondCompare4_is1
Publisher : Scooter Software
DisplayVersion : 4.4.6.27483