2009-02-21 3 views
4

Я хочу проверить, установлены или нет определенные компоненты Microsoft, такие как wmencoder, directx или wmplayer . Если он установлен, могу ли я получить его номер версии?проверить, имеются ли компоненты Microsoft или нет.

Как я могу это сделать?

Заранее спасибо.

+0

Это для программы установки? Или вам нужно проверить это на своем программном коде C#? –

ответ

0

Моя первая мысль была бы WMI. Класс Win32_SoftwareElement (по MSDN)

Но, скорее всего, потребуется определенная работа, чтобы получить нужные классы и запросы. Начните с инструментов WMI для WMI CIM Studio.

с помощью PowerShell, что-то вроде:

gwmi win32_softwareelement -filter "name like '%play%'" | ft 

позволит найти правильные идентификаторы. (Предупреждение: это крайне slow.)

Возможно, что API MS Installer (MSI) имеет что-то более быстрое.

+0

По вопросу Тег, это похоже на вопрос C#. Вы опубликовали бы эквивалентный код .NET (в C#) для сценария PowerShell? Благодарю. – Sung

+0

Это займет довольно много времени (я не часто использую WMI внутри кода .NET), и у меня, вероятно, нет такого времени. WQL, чтобы поместить в класс запросов System.management: SELECT * FROM Win32_SoftwareElement ГДЕ имя типа%% play%. – Richard

0

Я использую Regshot для определения параметров реестра, которые могут использоваться, чтобы проверить, установлен ли softwre ..

3

Я использую ниже, чтобы определить, установлены другие приложения, однако вы должны знать «уникальный» код продукта (из проекта установки в Visual Studio), с которым установлено приложение в реестре.

Включить

using System.Diagnostics; 
using Microsoft.Win32; 

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

// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F03A-0000-0000-C000-000000000046} << This is outlook 2003 
String retval = ""; 

// Look to see if Outlook 2003 is installed and if it is... 
if ((checkComServerExists("{0006F03A-0000-0000-C000-000000000046}", out retval))) 
{ 
    // Update boolean flag if we get this far so we don't have to check again 
    Console.WriteLine("Office CSLID exists - Version: " + retval); 
} 

Функция:

// Checks to see if the given CLSID is registerd and exists on the system 
private static Boolean checkComServerExists(String CLSID, out String retval) 
{ 
    RegistryKey myRegKey = Registry.LocalMachine; 
    Object val; 

    try 
    { 
     // get the pathname to the COM server DLL/EXE if the key exists 
     myRegKey = myRegKey.OpenSubKey("SOFTWARE\\Classes\\CLSID\\" + CLSID + "\\LocalServer32"); 
     val = myRegKey.GetValue(null); // the null gets default 
    } 
    catch 
    { 
     retval = "CLSID not registered"; 
     return false; 
    } 

    FileVersionInfo myFileVersionInfo = null; 
    try 
    { 
     // parse out the version number embedded in the resource 
     // in the DLL 
     myFileVersionInfo = FileVersionInfo.GetVersionInfo(val.ToString()); 
    } 
    catch 
    { 
     retval = String.Format("DLL {0} not found", val.ToString()); 
     return false; 
    } 

    retval = myFileVersionInfo.FileVersion; 
    return true; 
} 
Смежные вопросы