2009-09-22 21 views
6

Muszę sprawdzić, gdzie program jest zainstalowany według nazwy programu (nazwa pojawia się w Dodaj lub usuń programy). Jaki jest najlepszy sposób na to, żeby działał dobrze dla wszystkich języków.Jak sprawdzić w C#, gdzie program jest zainstalowany

+0

??? Czy możesz sprecyzować swoje pytanie? Czy pytasz, czy program jest oparty na .Net, czy coś innego? – Graviton

+0

Sprawdź rejestr. – RaYell

Odpowiedz

12

Spójrz do rejestru w

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 

Wystarczy iteracyjne nad wszystkie podklucze i spojrzeć na wartości displayname i InstallLocation. Tutaj znajdziesz informacje, które chcesz i wiele więcej ;-)

+0

Przynajmniej lokalizacja InstallLocation może być dziełem literackim; na przykład lokalizacja InstallLocation, według rejestru, dla Crystal 11 to "C: \ Program Files \ Nazwa twojej firmy \ Nazwa twojego produktu \". W wielu przypadkach nie jest on również ustawiony. –

0

Można to osiągnąć za pomocą klas WMI. Ale warunkiem jest

  • wniosek i musi być uruchomiony

poniżej przykładowy kod to zrobić

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 działało dobrze dla mnie w języku C#. Użyj pinvoke (http://www.pinvoke.net/default.aspx/msi.msigetproductinfo), aby użyć tej funkcji. –

+0

Jeśli chcesz uniknąć używania PInvoke, myślę, że te informacje można uzyskać za pośrednictwem Deployment Tools Foundation (DTF), części WiX. http://robmensching.com/blog/posts/2008/5/16/deployment-tools-foundation-joins-the-wix-toolset – RenniePet

8

Aby dodać do odpowiedzi Olivera, zawarłem to sprawdzenie w statycznej metodzie.

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; 
} 
Powiązane problemy