Назад | Перейти на главную страницу

Удаленно проверять версию установленного ПО?

Я ищу метод или инструмент, который я могу установить (на машинах) для удаленной проверки установленных версий различных программ. Мне нужно проверить это примерно на 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