WMI «установленный» запрос отличается от списка добавления / удаления программ? - PullRequest
39 голосов
/ 23 марта 2009

Попытка использовать WMI для получения списка установленных программ для Windows XP. Используя wmic, я попробовал:

wmic /output:c:\ProgramList.txt product get name,version

и я получаю список многих установленных программ, но после очистки этого списка от отображения «Установка и удаление программ» я вижу гораздо больше программ, перечисленных в графическом интерфейсе «Установка и удаление программ», чем с помощью запроса WMI. Есть ли другой WMI-запрос, который мне нужно использовать, чтобы установить остальные программы? Или есть какое-то другое место, где мне нужно искать остальное?

Кроме того, в запросе WMI перечислены две установленные программы, которых нет в программе «Установка и удаление программ». Есть идеи почему?

Ответы [ 12 ]

28 голосов
/ 23 марта 2009

Я полагаю, что ваш синтаксис использует класс Win32_Product в WMI. Одна из причин заключается в том, что этот класс отображает только продукты, установленные с помощью установщика Windows ( См. Здесь ). Ключ реестра для деинсталляции - ваш лучший выбор. Вот некоторый код для мониторинга ключа реестра.

ОБНОВЛЕНИЕ ДЛЯ КОММЕНТАРИЙ:

Ключ реестра для удаления - это стандартное место для списка того, что установлено, а что нет. Это место, которое список «Установка и удаление программ» будет использовать для заполнения списка приложений. Я уверен, что есть приложения, которые не перечислены в этом месте. В этом случае вам придется прибегнуть к другому более грубому методу, такому как поиск в каталоге Program Files или поиск в списке программ в меню «Пуск». Оба эти способа определенно не идеальны.

На мой взгляд, поиск ключа реестра - лучший способ.

13 голосов
/ 23 марта 2009

Все, что действительно делает установка / удаление программ, читает этот ключ реестра:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
7 голосов
/ 07 февраля 2011

Помимо наиболее известного ключа реестра для установленных программ:

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall

Команда wmic и программы добавления / удаления также запрашивают другой раздел реестра:

HKEY_CLASSES_ROOT \ Installer \ Products

Имя программного обеспечения, отображаемое в списке, считывается из значения «Значение данных» в этом ключе: ProductName

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

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

5 голосов
/ 17 марта 2011

Я использую Inno Setup для установщика. Я использую только 64-битную Windows 7. Я обнаружил, что записи реестра записываются в

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall

Я еще не выяснил, как сделать так, чтобы этот список сообщался WMI (хотя программа указана как установленная в разделе «Программы и компоненты»). Если я это выясню, я постараюсь не забыть сообщить здесь.

UPDATE:

Записи для 32-разрядных программ, установленных на 64-разрядной машине, находятся в этом разделе реестра. Здесь больше написано:

http://mdb -blog.blogspot.com / 2010/09 / с-заезд, если-programapplication-is.html

Смотрите мой комментарий, который описывает 32-битное или 64-битное поведение в том же посте здесь:

http://mdb -blog.blogspot.com / 2010/09 / с-заезд, если-programapplication-is.html? ShowComment = 1300402090679 # c861009270784046894

К сожалению, похоже, нет способа заставить WMI перечислить все программы из списка добавления / удаления программ (также называемые «Программы и компоненты» в Windows 7, не уверенный в Vista). Мой текущий код отбросил WMI в пользу использования реестра. Сам код для опроса реестра даже проще, чем с помощью WMI. Пример кода находится по ссылке выше.

4 голосов
/ 01 апреля 2011

Не самый лучший, но практичный ли это метод:

Использование HijackThis .

Запустите угон, нажмите кнопку «Открыть раздел« Инструменты »»

HijackThis Main Menu

нажмите «Открыть диспетчер удаления»

HijackThis Configuration

нажмите «Сохранить список» (* .txt), да в ответ на запрос, откроется блокнот со списком добавления / удаления программ.

HijackThis Add/Remove Programs Manager


Источник

2 голосов
/ 24 января 2012

Вы можете использовать скрипт из http://technet.microsoft.com/en-us/library/ee692772.aspx#EBAA для доступа к реестру и составления списка приложений с помощью WMI.

2 голосов
/ 18 марта 2011

Установленные продукты состоят из установленных программных элементов и функций, поэтому стоит проверить псевдонимы wmic для PRODUCT, а также проверить ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ и ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ:

wmic product get name,version

wmic softwareelement get name,version

wmic softwarefeature get name,version
1 голос
/ 19 декабря 2011

Чтобы создать более-менее надежный список приложений, отображаемых в разделе «Программы и функции» на панели управления, необходимо учитывать, что не все приложения были установлены с использованием MSI. WMI предоставляет только те, которые установлены с MSI.

Вот краткое изложение того, что я узнал:

Приложения MSI всегда имеют подраздел Код продукта (GUID) под HKLM\...\Uninstall и / или под HKLM\...\Installer\UserData\S-1-5-18\Products. Кроме того, они могут иметь ключ, который выглядит как HKLM\...\Uninstall\NotAGuid.

Приложения без MSI не имеют кода продукта и, следовательно, имеют такие ключи, как HKLM\...\Uninstall\NotAGuid или HKCU\...\Uninstall\NotAGuid.

0 голосов
/ 24 февраля 2018

Надеюсь, это кому-нибудь поможет: я использую перечисление на основе реестра в своих сценариях (как предложено в некоторых ответах выше), но обнаружил, что оно неправильно перечисляет 64-разрядное программное обеспечение при работе в Windows 10 x64 через SCCM (который использует 32-битный клиент). Нашел что-то вроде этого, чтобы быть самым простым решением в моем конкретном случае:

Function Get-Programs($Bits) {
  $Result = @()
  $Output = (reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /reg:$Bits /s)

  Foreach ($Line in $Output) {
    If ($Line -match '^\s+DisplayName\s+REG_SZ\s+(.+?)$') {
      $Result += New-Object PSObject -Property @{
        DisplayName = $matches[1];
        Bits = "$($Bits)-bit";
      }
    }
  }

  $Result
}

$Software  = Get-Programs 32
$Software += Get-Programs 64

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

P.S. Изо всех сил стараюсь воздержаться от выкладывания тонны соли на Microsoft здесь, чтобы сделать абсолютно тривиальную вещь почти невозможной. То есть, перечисление всех версий MS Office, используемых в сети, является задачей, которая заставит плакать взрослого человека.

0 голосов
/ 23 февраля 2018

Вы можете получить его в одну строку с PowerShell и командным файлом:

@echo off
Powershell /command "Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-List"
Pause
...