Эта статья рассказывает, как в командной строке Windows получить список программ, установленных на компьютере, локальном или удалённом.

Статья предназначена для системных администраторов, которые хотели бы автоматизировать контроль установленных программ на компьютерах своей сети. Например, можно проверить, установлено ли важное обновление Windows или все ли рабочие станции имеют правильную версию Office. Далее показаны примеры кода, а в конце статьи находятся ссылки на скачивание файлов.

Как получить информацию об установленных программах

Данные об установленных на компьютере программах хранятся в реестре Windows, причем в нескольких местах. Программы, установленные «для всех пользователей», перечисляются в ветви:
HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\

Программы, установленные «для текущего пользователя», находятся здесь::
HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

И ещё есть специальная ветвь в Windows x64:
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

Поэтому для считывания программ с одним типом установки достаточно просмотреть одну из этих ветвей, а для получения полного списка установленных программ на компьютере потребуется просканировать все три ветви реестра, а затем объединить списки.

Написание команд и bat файлов

Просмотр ветви реестра и вывод списка установленных программ удаленного компьютера

Содержимое bat файла для печати списка программ, установленных для всех пользователей:

set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c

Если имя компьютера не задано, то печатаются сведения по локальному компьютеру.

Печать списка установленных программ по трем папкам реестра

Чтобы вывести информацию о всех программах, нужно просканировать все три ветви реестра:

set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c

set reg_key=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c

set reg_key=hkcu\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c

На выходе получится полный список установленных программ, но он может содержать одинаковые строки.

Упорядочивание списка программ

Убрать дублирование и отсортировать список по алфавиту можно с помощью встроенной команды sort.

set output=%temp%\programs.txt
if exist "%output%" del "%output%"

rem Программы для всех пользователей x64
set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c >> "%output%"

rem Программы для всех пользователей x86
set reg_key=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c >> "%output%"

rem Программы текущего пользователя
set reg_key=hkcu\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
if not "%1" == "" set reg_key=\\%~1\%reg_key%
for /F "tokens=1,2,*" %%a in ('reg query "%reg_key%" /s') do ^
if "%%a" == "DisplayName" echo %%c >> "%output%"

rem Сортировка и удаление дублирования
sort "%output%" /unique
del "%output%"

Сначала все программы вносятся в общий файл списка, а затем команда sort удаляет дубликаты и сортирует список.

Как использовать список установленных программ

Проверить, что программа установлена на компьютере

Проверить, что определенная программа установлена на компьютере можно, применяя поиск find или findstr к списку программ. Например, проверить, что обновление KB2570791 установлено на компьютере WS_ALEX:

programs-sorted.bat | find /i "KB2570791"

Проверить, что программа установлена на нескольких компьютерах

Такую же проверку можно сделать в цикле имен компьютеров.

@echo off
rem %1 Полное название программы или часть названия программы.
rem %2 Имя файла со списком компьютеров.

for /F %%a in (%2) do (
    echo %%a...
    call programs-sorted.bat %%a | find /i "%~1"
)

Пример списка файлов pc.list

SERVER_DB
SERVER_FILES
WS_ALEX
WS_RECEPTION

Скачивание и установка

Загрузка файлов

Скачать bat файлы можно по ссылке:

Некоторые bat файлы используют программу nhcolor для выделения текста цветом, поэтому потребуется также скачать программу nhcolor по ссылке ниже. Если выделение цветом не требуется, то её вызов можно заменить на команду echo.

Вопросы и ответы

Какие особенности запуска bat файлов?

bat файлы должны быть запущены с административными полномочиями по отношению к удаленным компьютерам.

Узнать больше

Получение списка установленных программ в VBS скрипте

Просмотреть ветвь реестра можно также в WSH скрипте, например, этот код на VBScript (взят с сайта Майкрософт) перечисляет программы, установленные для всех пользователей, при этом выводит дополнительную информацию, по сравнению с bat файлом: дату установки, номер версии программы, примерный размер на диске:

Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
strComputer = "computer"
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
strEntry1a = "DisplayName"
strEntry1b = "QuietDisplayName"
strEntry2 = "InstallDate"
strEntry3 = "VersionMajor"
strEntry4 = "VersionMinor"
strEntry5 = "EstimatedSize"

Set objReg = GetObject("winmgmts://" & strComputer & _
"/root/default:StdRegProv")
objReg.EnumKey HKLM, strKey, arrSubkeys
WScript.Echo "Installed Applications (" & strComputer & ")" & VbCrLf
For Each strSubkey In arrSubkeys
  intRet1 = objReg.GetStringValue(HKLM, strKey & strSubkey, _
   strEntry1a, strValue1)
  If intRet1 <> 0 Then
    objReg.GetStringValue HKLM, strKey & strSubkey, _
     strEntry1b, strValue1
  End If
  If strValue1 <> "" Then
    WScript.Echo VbCrLf & "Display Name: " & strValue1
  End If
  objReg.GetStringValue HKLM, strKey & strSubkey, _
   strEntry2, strValue2
  If strValue2 <> "" Then
    WScript.Echo "Install Date: " & strValue2
  End If
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _
   strEntry3, intValue3
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _
   strEntry4, intValue4
  If intValue3 <> "" Then
     WScript.Echo "Version: " & intValue3 & "." & intValue4
  End If
  objReg.GetDWORDValue HKLM, strKey & strSubkey, _
   strEntry5, intValue5
  If intValue5 <> "" Then
    WScript.Echo "Estimated Size: " & Round(intValue5/1024, 3) & " megabytes"
  End If
Next

Этот скрипт печатает каждый параметр на отдельной строке, то есть каждая программа занимает несколько строк:

Но если необходим другой формат, то его нетрудно задать в коде скрипта, например, выводить в одну строку или в формате CSV,

Команда sort

В bat файле полного списка установленных программ programs-sorted.bat используется команда sort для сортировки списка и удаления одинаковых строк.

Справку по команде sort лучше смотреть на сайте Microsoft, например, по ссылке sort, хотя страница и указана как относящаяся к Windows Server. Встроенная справка sort /? или help sort не показывает параметр /unique, хотя он работает (Windows 10).

Программа nhcolor

Наши соцсети

Установленные программы на удаленном компьютере
Метки:     

6 мыслей о “Установленные программы на удаленном компьютере

  • 04.03.2024 в 10:36
    Постоянная ссылка

    Вопрос по скрипту на VBS, в тексте указано что он обходит только одну ветку.
    Поэтому если мне необходимо получить полный список, то необходимо обойти еще две оставшиеся.
    Вопрос в следующем, как можно отсортировать получаемый список программ и не допустить появление дублей?

    Ответ
    • 13.03.2024 в 05:12
      Постоянная ссылка

      Командой sort можно отсортировать список и удалить дубли. Эта команда хорошо подходит для варианта с bat файлами, где выводится по одной строке на каждую программу.
      Пример VBS скрипта выводит по несколько строк на программу, поэтому сортировка и чистка такого текста потребует дополнительных усилий.

      Ответ
  • 17.10.2014 в 20:28
    Постоянная ссылка

    Командный файл, который перечисляет все программы (компьютера и пользователя, 32/64 бита):
    @echo off

    echo *** Local Machine x64 Programs
    set reg_key=hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    for /F «tokens=1,2,*» %%a in (‘reg query «%reg_key%» /s’) do ^
    if «%%a» == «DisplayName» echo %%c

    echo *** Local Machine x32 Programs
    set reg_key=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    for /F «tokens=1,2,*» %%a in (‘reg query «%reg_key%» /s’) do ^
    if «%%a» == «DisplayName» echo %%c

    echo *** Current User programs
    set reg_key=hkcu\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    for /F «tokens=1,2,*» %%a in (‘reg query «%reg_key%» /s’) do ^
    if «%%a» == «DisplayName» echo %%c

    Ответ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *