Я ищу метод или инструмент, который я могу установить (на машинах) для удаленной проверки установленных версий различных программ. Мне нужно проверить это примерно на 60 машинах Windows.
Кто-нибудь знает решение (с открытым исходным кодом) для этого.
Вы можете использовать запросы 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 может делать множество замечательных вещей для управления системой на лету.
Мы используем сценарии 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
...............
Используйте встроенную команду wmic.exe
wmic /node:[hostname or ip address] product > product_list.txt
notepad product_list.txt