WMI "установлен" запрос отличается от списка добавления/удаления программ?
Попытка использовать WMI для получения списка установленных программ для Windows XP. Используя wmic, я попробовал:
wmic /output:c:\ProgramList.txt product get name,version
и я получаю список многих установленных программ, но после очистки этого списка от того, что отображается надстройкой "Установка и удаление программ" , я вижу еще много программ, перечисленных в графическом интерфейсе "Установка и удаление программ" , чем с запросом WMI. Есть ли другой запрос WMI, который я должен использовать, чтобы установить остальные программы? Или есть какое-то другое место, где мне нужно искать остальных?
Кроме того, есть два установленных программы, которые перечислены в запросе WMI, которые не входят в "Установка и удаление программ" . Любая идея почему?
Ответы
Ответ 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
Ответ 7
Вы можете использовать script из http://technet.microsoft.com/en-us/library/ee692772.aspx#EBAA для доступа к реестру и перечислить приложения с использованием WMI.
Ответ 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