2009-09-22 20 views
6

Devo verificare dove è installato un programma in base al nome del programma (nome visualizzato in Installazione applicazioni). Qual è il modo migliore per farlo funzionare bene per tutte le lingue.Come verificare con C# in cui è installato un programma

+0

??? Puoi specificare la tua domanda più chiara? Stai chiedendo se un programma è basato su .Net, o qualcos'altro? – Graviton

+0

Controllare il registro. – RaYell

risposta

12

Date un'occhiata nel Registro di sistema a

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 

Proprio iterare su tutte le sottochiavi e dare un'occhiata nei valori DisplayName e InstallLocation. Qui troverai le informazioni che desideri e molto altro ;-)

+0

Almeno l'InstallLocation può essere un'opera di finzione; ad esempio, InstallLocation, in base al Registro di sistema, per Crystal 11 è "C: \ Programmi \ Nome azienda \ Nome prodotto \". In molti casi, non è nemmeno impostato. –

0

È possibile ottenere questo utilizzando le classi WMI. Ma il presupposto è

  • la candidatura e dovranno essere in esecuzione

sotto il codice di esempio per fare questo

string queryString = 
       "SELECT Name, ProcessId, Caption, ExecutablePath" + 
       " FROM Win32_Process"; 

      SelectQuery query = new SelectQuery(queryString); 
      ManagementScope scope = new System.Management.ManagementScope(@"\\.\root\CIMV2"); 

      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
      ManagementObjectCollection processes = searcher.Get(); 


      foreach(ManagementObject mObj in processes) 
      { 
           var name = mObj ["Name"].ToString(); 
           var ProcessId = Convert.ToInt32(mObj ["ProcessId"]); 
           var Caption = mObj ["Caption"].ToString(); 
           var Path = mObj ["ExecutablePath"].ToString(); 
      } 
4
+0

MsiGetProductInfo ha funzionato bene per me in C#. Utilizzare pinvoke (http://www.pinvoke.net/default.aspx/msi.msigetproductinfo) per utilizzare la funzione. –

+0

Se si desidera evitare l'uso di PInvoke, penso che queste informazioni possano essere ottenute tramite Deployment Tools Foundation (DTF), una parte di WiX. http://robmensching.com/blog/posts/2008/5/16/deployment-tools-foundation-joins-the-wix-toolset – RenniePet

8

Per aggiungere alla risposta di Oliver ho concluso questo controllo all'interno di un metodo statico.

public static bool IsProgramInstalled(string programDisplayName) { 

    Console.WriteLine(string.Format("Checking install status of: {0}", programDisplayName)); 
    foreach (var item in Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall").GetSubKeyNames()) { 

     object programName = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + item).GetValue("DisplayName"); 

     Console.WriteLine(programName); 

     if (string.Equals(programName, programDisplayName)) { 
      Console.WriteLine("Install status: INSTALLED"); 
      return true; 
     } 
    } 
    Console.WriteLine("Install status: NOT INSTALLED"); 
    return false; 
} 
Problemi correlati