2009-02-21 8 views
4

Je veux vérifier si certains composants microsoft comme wmencoder, directx ou wmplayer sont installés ou non. Si elle est installée, puis-je également obtenir son numéro de version?vérifier si les composants microsoft sont présents ou non

Comment puis-je faire cela?

Merci d'avance.

+0

S'agit-il d'un programme d'installation? Ou avez-vous besoin de vérifier cela dans votre code de programme C#? –

Répondre

0

Ma première pensée serait WMI. Classe Win32_SoftwareElement (sur MSDN)

Mais il est probable qu'il faudra travailler pour obtenir les bonnes classes et requêtes. Commencez avec les outils WMI pour WMI CIM Studio.

En utilisant PowerShell, quelque chose comme:

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

permettra de trouver les bons ids. (Attention: ceci est extrêmement lent.)

Possible que l'API MS Installer (MSI) a quelque chose de plus rapide.

+0

Selon la question Tag, cela semble être une question C#. Souhaitez-vous publier un code équivalent .NET (en C#) pour le script PowerShell? Merci. – Sung

+0

Cela prendra un peu de temps (je n'utilise pas souvent WMI dans le code .NET), et je n'ai probablement pas ce temps. Le WQL à mettre dans la classe de requête System.management: SELECT * FROM Win32_SoftwareElement WHERE nom comme '% play%'. – Richard

0

J'utilise RegShot pour déterminer paramètre de Registre qui peut être utilisé pour vérifier si un logiciel client est installé ..

3

J'utilise le ci-dessous pour déterminer si d'autres applications sont installées, mais vous aurez besoin de connaître le « unique » code du produit (à partir du projet d'installation dans Visual Studio) avec lequel l'application est installée avec dans le Registre.

Inclure

using System.Diagnostics; 
using Microsoft.Win32; 

Utilisation:

// 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); 
} 

Fonction:

// 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; 
} 
Questions connexes