Удаленно проверить версию с установленного программного обеспечения?

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

    ...............
Другие вопросы по тегам