![远程检查已安装软件的版本?](https://linux22.com/image/529459/%E8%BF%9C%E7%A8%8B%E6%A3%80%E6%9F%A5%E5%B7%B2%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E7%9A%84%E7%89%88%E6%9C%AC%EF%BC%9F.png)
我正在寻找一种可以安装在机器上的方法或工具,以便远程检查安装了哪些不同程序的版本。我需要检查大约 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