2011-01-07 2 views
1

Я хочу получить номера версий программных продуктов, установленных на моей машине ... возможно ли использование класса реестра в C#?Как получить установленную версию приложения из реестра?

 RegistryKey regKey; 

    public void ReadReg() 
    { 
     regKey = Registry.LocalMachine; 
     RegistryKey sk= regKey.OpenSubKey("SOFTWARE\\"); 
     string[] subKeys = sk.GetSubKeyNames(); 

     foreach (string sub in subKeys) 
     { 
      Console.WriteLine(sub); 
     }    
    } 
+1

Какое программное обеспечение вам подходит? – Oleg

+0

@ Должно быть, немцы здесь ;-) –

+1

@Uwe Keim: Спасибо Уве! Это фиксированная. – Oleg

ответ

3

Нет стандартного и общедоступного места, где установщики хранят информацию о продукте. Однако база данных установщика содержит эту информацию (где продукты используют MSI — прямо или косвенно), и эта информация доступна через WMI.

WMI также можно использовать с .NET с типами System.Management. Запрос:

select name,version from Win32_Product 

Адаптация образца here на этот запрос не должен быть слишком жестким.

+0

+1, аккуратный и не знал этого. –

1

И какой ключ вы собираетесь посмотреть, и как вы определяете его номер версии? Нет гарантий, поскольку они будут меняться от поставщика к поставщику.

В качестве альтернативы можно перечислить исполняемые файлы на вашем компьютере (скажем, в C:\Program Files\ и это вложенные папки), а также использовать FileVersionInfo для извлечения информации о версии из самого исполняемого файла:

FileVersionInfo fi = FileVersionInfo.GetVersionInfo("yourexe.exe"); 
+0

, но пользователь может установить программное обеспечение в любом месте? –

+0

@Sisya yup, но вы не * имеете *, чтобы ограничить поиск 'Program Files'. См. Эту ссылку: http://www.thereforesystems.com/get-a-list-of-installed-applications-using-linq-and-c/ –

0

Вы можете получить версию, как -

string version = sk.GetValue("Version"); 

Если версия Version доступна, она вернет значение, иначе она вернет значение null.

+0

-1: Правильно, но бесполезно. Это * - это то, как вы читаете значение из раздела реестра, но на самом деле вопрос: где ключи/значения, содержащие информацию о версии (быстрый ответ: некоторые приложения могут иметь это в реестре, но в целом это не в реестр). – Richard

+0

@Richard: thats true ... есть ли какой-нибудь метод, который мог бы помочь? –

+0

@ Сися: См. Мой ответ. – Richard

1

Нет гарантии, что вы найдете информацию о версии программы в реестре. Я использую ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\programname , чтобы найти полный путь, но он все равно зависит от установки/установки программы, чтобы установить это значение. Если бы было достаточно приятно использовать это соглашение, вы можете использовать полный путь для вызова GetFileVersionInfo(...).

По-прежнему разработчик может заполнить полезную информацию о ресурсе, такую ​​как версия, название компании, описание, авторское право и т. Д. Вы можете сказать, что некоторые программы имеют старые хранилища по умолчанию «Делать» в ресурсе. Другие, даже Microsoft, забудут включить название компании в ресурс для таких программ, как Dumprep. Другие Exe, созданные без Visual Studio, не утруждают себя включением любого сегмента ресурсов, к которому можно получить доступ: GetFileVersionInfo().

В конечном счете, я считаю, что эта функция является самой надежной. Также обратите внимание, перед вызовом GetFileVersionInfo() убедитесь, что вы звоните GetFileVersionSize(). Если это x64-версия Windows, в некоторых случаях вам может потребоваться позвонить Wow64DisableWow64FsRedirection(...) & Wow64RevertWow64FsRedirection(...) или использовать SysNative, если программа, которую вы ищете, находится в системной папке, которая перенаправляется.

Смежные вопросы