如何使用PowerShell查找已安装的软件?

如何使用PowerShell查找已安装的软件?,powershell,windows-installer,Powershell,Windows Installer,是否有使用PowerShell查找已安装软件的选项?软件主要安装在MSI基础上。我用下面的代码进行了尝试,但我不确定它是否可靠,是否适用于所有软件产品。例如,32位和64位 Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | ` Select DisplayName, DisplayVersion, Publisher, InstallDate | sort {[st

是否有使用PowerShell查找已安装软件的选项?软件主要安装在MSI基础上。我用下面的代码进行了尝试,但我不确定它是否可靠,是否适用于所有软件产品。例如,32位和64位

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | `
Select DisplayName, DisplayVersion, Publisher, InstallDate | sort {[string]$PSItem}

是否有可靠的方法查找每个已安装的软件?

您可以使用以下PowerShell命令查找有关已安装软件、更新和修补程序的所有信息:

try{
    $InstalledSoftware = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
    $InstalledSoftware += Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*
} catch {
    Write-warning "Error while trying to retreive installed software from inventory: $($_.Exception.Message)"
}
如果要查找已安装的MSI,可以使用以下命令:

$InstalledMSIs = @()
foreach ($App in $InstalledSoftware){
    if($App.PSChildname -match "\A\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}\z"){
        $InstalledMSIs += New-Object PSObject -Property @{
            DisplayName = $App.DisplayName;
            DisplayVersion = $App.DisplayVersion;
            Publisher = $App.Publisher;
            InstallDate = $App.InstallDate;
            GUID = $App.PSChildName;    
        }
    }
}
此外,您还可以使用以下命令检查Windows Server 2008或更高版本操作系统上已安装的功能:

Get-WindowsFeature -ErrorAction Stop | Where-Object {$_.Installed} | Sort-Object DisplayName

下面的命令将为您提供所有已安装软件的详细信息(我相信这更可靠)


该注册表项的内容将与您在“程序和功能”控制面板下看到的软件相同,此外还有修补程序,当然还有非MSI软件。要完成上述操作,必须检查HKLM位置(32位和64位)以及HKCU。当然,在给定的机器上,这在实践中可能没有什么不同。感谢这种方法,结果看起来肯定比使用regkeys的方法更漂亮,但是这里没有显示一些软件产品。例如,我安装了Foxit Reader,该软件仅在查看注册表项时显示,但不幸的是,不使用wmi…您知道为什么吗?Win32_产品仅显示Windows Installer(MSI)安装,因此它不足以用于应用程序清单。HKLM+HKCU Software\Microsoft和Software\Wow6432Node\Microsoft中的卸载注册表项是破坏AFAIK.Win32_产品的最佳方式:查询此类将强制在所有已注册的MSI应用程序上重新注册(有时进行修复)(这就是为什么它如此缓慢的原因)。在查询这个类之后,请检查您的应用程序事件日志以了解我的意思。谢谢您的添加。现在我得到了32位和64位软件。此外,是否有可能从结果中获取MSI产品代码?MSI产品代码是卸载密钥正下方的密钥名称。您可以通过选择PSChildname找到此名称,并将其与regex
$InstalledSoftware[0].PSChildname-match“\a\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\z”匹配
。我可以用一个例子更新我的答案吗?谢谢你的快速回复。举个例子就好了!像这样的东西。。?
Get-WmiObject -Class Win32_Product