远程检查已安装软件的版本?

远程检查已安装软件的版本?

我正在寻找一种可以安装在机器上的方法或工具,以便远程检查安装了哪些不同程序的版本。我需要检查大约 60 台 Windows 机器。

有人知道这个问题的(开源)解决方案吗?

答案1

如果软件使用 MSI 自行安装,则可以使用 WMI 查询获取已安装软件的列表。如下所示:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
    ("Select * from Win32_Product")

For Each objSoftware in colSoftware
    Wscript.Echo "Name: " & objSoftware.Name
    Wscript.Echo "Version: " & objSoftware.Version
Next

这只是一个基本的例子。WMI 可以实时执行许多出色的系统管理工作。

答案2

我们使用 PowerShell 脚本和 WMI 查询从 Windows 计算机收集信息并将信息存储在数据库中。稍后我们可能会查询这些数据以查看每台计算机上安装的 Java 版本。

通过查看注册表路径 HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,我可以更好地跟踪已安装的软件。这通常会提供显示名称、显示版本、安装日期、发布者和其他版本信息。Java 数据库中的一行可能如下所示:

MACHINE_NAME,{26A24AE4-039D-4CA4-87B4-2F83216021FF},Java(TM) 6 更新 21,6.0.210,20100721,Oracle,06.00.0210,6,0,0,1,2010-11-01,07:40:22.830

您可以在 VBS 或 PS 中搜索并找到使用 WMI、注册表或 PSInfo 从远程计算机获取已安装软件的示例代码。我们使用注册表方法的部分方式如下:

$HKLM = [uint32]"0x80000002"
$softwareListKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
$regObject = [WmiClass]"\\$machineName\ROOT\DEFAULT:StdRegProv"  
$softwareKeys = $regObject.EnumKey($HKLM, $softwareListKeyPath) 
foreach ($softwareKeyName in $softwareKeys.sNames) {
    #// some are GUIDs, some are software names, ones with GUID will have DisplayName
    $softwareKeyPath = $softwareListKeyPath + $softwareKeyName

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "DisplayName")
    $displayName = $keyNameAndData.sValue

    $isWindowsUpdate = $false
    $rx = "(KB|M)\d{6}"
    if(($softwareKeyName -match $rx) -or ($displayName -match $rx)) {
        $isWindowsUpdate = $true
    }

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "DisplayVersion")
    $displayVersion = $keyNameAndData.sValue

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "InstallDate")
    $installDate = $keyNameAndData.sValue

    $keyNameAndData = $regObject.GetStringValue($HKLM, $softwareKeyPath, "Publisher")
    $publisher = $keyNameAndData.sValue

    ...............

答案3

使用内置的 wmic.exe 命令

wmic /node:[hostname or ip address] product > product_list.txt

notepad product_list.txt

相关内容