Удаленно проверить версию с установленного программного обеспечения?
Я ищу способ или инструмент, который я могу установить (на компьютерах), чтобы удаленно проверить, какие версии различных программ установлены. Мне нужно проверить это около 60 машин Windows.
Кто-нибудь знает (с открытым исходным кодом) решение для этого.
3 ответа
Вы можете использовать запросы WMI для получения списка установленного программного обеспечения, если оно использовало MSI для установки самого себя. Что-то вроде этого:
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 может сделать много полезных вещей для управления системой на лету.
Используйте встроенную команду wmic.exe
wmic /node:[hostname or ip address] product > product_list.txt
notepad product_list.txt
Мы используем сценарии PowerShell и запросы WMI для сбора информации с компьютеров Windows и сохранения информации в базе данных. Позже мы можем запросить эти данные, чтобы увидеть, какая версия Java установлена на каждом компьютере.
У меня были лучшие результаты отслеживания установленного программного обеспечения, просматривая реестр по пути HKLM: ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \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
...............