Подтвердить что ты не робот

WMI "установлен" запрос отличается от списка добавления/удаления программ?

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

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

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

Кроме того, есть два установленных программы, которые перечислены в запросе WMI, которые не входят в "Установка и удаление программ" . Любая идея почему?

4b9b3361

Ответ 1

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

ОБНОВЛЕНИЕ ЗА КОММЕНТАРИИ:

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

По-моему, поиск ключа реестра - лучший способ.

Ответ 2

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

Ответ 3

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

wmic, а программы add/remove также запрашивают другой раздел реестра:

HKEY_CLASSES_ROOT\Installer\Products

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

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

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

Ответ 4

Я использую 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/c-check-if-programapplication-is.html

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

http://mdb-blog.blogspot.com/2010/09/c-check-if-programapplication-is.html?showComment=1300402090679#c861009270784046894

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

Ответ 5

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

Используйте HijackThis.

Запустите этот захват, нажмите кнопку "Открыть раздел" Разное "

HijackThis Main Menu

нажмите "Открыть менеджер деинсталляции"

HijackThis Configuration

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

HijackThis Add/Remove Programs Manager


Источник

Ответ 6

Установленные продукты состоят из установленных программных элементов и функций, поэтому стоит проверить wmic-псевдоним для PRODUCT, а также проверить SOFTWAREELEMENT и SOFTWAREFEATURE:

wmic product get name,version

wmic softwareelement get name,version

wmic softwarefeature get name,version

Ответ 8

Чтобы создать более или менее надежный список приложений, отображаемых в "Программы и Feautres" на панели управления, вы должны учитывать, что не все приложения были установлены с использованием 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.

Ответ 9

Установка и удаление программ также необходимо изучить в этом разделе реестра, чтобы найти установки для текущего пользователя:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall

Приложения, такие как Google Chrome, Dropbox или ярлыки, установленные через JavaWS (веб-начало) JNLP, можно найти только здесь.

Ответ 10

Я адаптировал MS-Technet VBScript для своих нужд. Он отбрасывает Wow6432Node, а также стандартные записи в "programms.txt" Используйте его на свой страх и риск, без каких-либо гарантий!

Сохранить как dump.vbs

Из командной строки: wscript dump.vbs

Const HKLM = &H80000002
Set objReg = GetObject("winmgmts://" & "." & "/root/default:StdRegProv")
Set objFSO = CreateObject("Scripting.FileSystemObject")

outFile="programms.txt"

Set objFile = objFSO.CreateTextFile(outFile,True)
writeList "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile
writeList "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile
objFile.Close 

Function writeList(strBaseKey, objReg, objFile) 
objReg.EnumKey HKLM, strBaseKey, arrSubKeys 
    For Each strSubKey In arrSubKeys
        intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "DisplayName", strValue)
        If intRet <> 0 Then
            intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "QuietDisplayName", strValue)
        End If
        objReg.GetStringValue HKLM, strBaseKey & strSubKey, "DisplayVersion", version
        objReg.GetStringValue HKLM, strBaseKey & strSubKey, "InstallDate", insDate 
        If (strValue <> "") and (intRet = 0) Then
            objFile.Write strValue & "," & version & "," & insDate & vbCrLf
        End If
    Next
End Function

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

Со временем продвинулся совсем немного, так как этот вопрос был задан...

В эти дни доступен класс WMI для записей об удалении из реестра. Это гораздо быстрее, чем ссылаться на Win32_Product, который, я думаю, также выполняет проверку по списку и может занять некоторое время для перечисления. В приведенном ниже коде Powershell (возможно, требуется Powershell 3 или более поздней версии) будут перечислены все записи (часть Out-Gridview просто для красивого отображения).

Get-CimInstance Win32Reg_AddRemovePrograms | Out-gridview