2009-05-26 15 views

Odpowiedz

88

Iterując klucza "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" rejestru wydaje się dać pełną listę zainstalowanych aplikacji.

Oprócz przykładu poniżej można znaleźć wersję podobną do tej, którą wykonałem: here.

Jest to trudny przykład, prawdopodobnie zechcesz zrobić coś, aby usunąć puste wiersze, tak jak w drugim podanym linku.

string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
using(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) 
{ 
    foreach(string subkey_name in key.GetSubKeyNames()) 
    { 
     using(RegistryKey subkey = key.OpenSubKey(subkey_name)) 
     { 
      Console.WriteLine(subkey.GetValue("DisplayName")); 
     } 
    } 
} 

Alternatywnie, można użyć WMI jak już wspomniano:

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
foreach(ManagementObject mo in mos.Get()) 
{ 
    Console.WriteLine(mo["Name"]); 
} 

Ale to jest raczej wolniejszy wykonać, i słyszałem może to tylko lista zainstalowanych programów w ramach „ALLUSERS”, chociaż to może być nieprawidłowe. Ignoruje również składniki systemu Windows & aktualizacje, które mogą być przydatne dla Ciebie.

+20

Warto zauważyć, że przy użyciu klasy WMI Win32_Product to zły pomysł, jeśli masz zamiar używać tego zapytania wielokrotnie. Zobacz ten artykuł Microsoft KB: http://support.microsoft.com/kb/974524/EN-US Podstawowym problemem jest (a) Win32_Product jest bardzo powolny i (b) generuje „Instalator Windows rekonfigurowane produkt . " komunikat dziennika zdarzeń * co * zainstalowany produkt w systemie ... za każdym razem, gdy uruchamiasz zapytanie. Doh! W tym artykule zaleca się użycie klasy Win32reg_AddRemovePrograms ..., której nie ma, chyba że zainstalowano SMS-a. Doh! Więc prawdopodobnie lepiej trzymać się kwerendy rejestru. –

+0

Komentarz Simona Gillbee'a powinien być zaakceptowaną odpowiedzią, czyli Kirtanami! WMI WIN32_Produkt nie jest sposobem, aby przejść tutaj, zaufaj mi! – bdd

+8

Er, dlatego przykład rejestru jest pierwszym w mojej odpowiedzi. WMI zaprezentowano po prostu jako alternatywne rozwiązanie, a nawet tam stwierdzam "jest to raczej wolniejsze wykonanie" i inne wady. Przeczytaj odpowiedź od początku. ;) – Xiaofu

1

Powtórz klucze "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" i sprawdź ich wartości "DisplayName".

10

Możesz spojrzeć na this article. Korzysta z rejestru, aby odczytać listę zainstalowanych aplikacji.

public void GetInstalledApps() 
{ 
    string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey)) 
    { 
     foreach (string skName in rk.GetSubKeyNames()) 
     { 
      using (RegistryKey sk = rk.OpenSubKey(skName)) 
      { 
       try 
       { 
        lstInstalled.Items.Add(sk.GetValue("DisplayName")); 
       } 
       catch (Exception ex) 
       { } 
      } 
     } 
    } 
} 
+0

Nie chcę całej listy, potrzebuję tylko wybranych programów instalacyjnych, więc co mogę zrobić dla tego. Dziękuję –

1

Może Proponuję przyjrzeć WMI (Windows Management Instrumentation). Po dodaniu odniesienia do System.Management do projektu C# uzyskasz dostęp do klasy "ManagementObjectSearcher", która prawdopodobnie okaże się przydatna.

Istnieją różne klasy WMI dla Installed Applications, ale jeśli był zainstalowany z Instalatorem Windows, klasa Win32_Product prawdopodobnie najlepiej Ci odpowiada.

ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
+0

nie korzystać z tego: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

Użyj interfejsu Windows Installer API!

Pozwala to na rzetelne wyliczenie wszystkich programów. Rejestr nie jest wiarygodny, ale WMI jest waga ciężka.

+0

z pewnością jest to duża waga - w przypadku wielokrotnego uruchamiania, wydajność spada jak ciężka. jeśli funkcja mojej aplikacji zależy od innej aplikacji i wiem, czy jest zainstalowana prawidłowo, potrzebuję tylko klucza rejestru dezinstalacyjnego dla 32 lub 64 tylko wtedy, gdy aplikacja jest dostępna również w wersji 64-bitowej) z drugiej strony, jeśli muszę używaj wmi, ograniczę się do używania tylko raz podczas aplikacji za pomocą sztuczki własności inteligentnej. – gg89

1

Użyłem podejścia Nicks - musiałem sprawdzić, czy Remote Tools for Visual Studio są zainstalowane, czy nie, wydaje się nieco powolne, ale w osobnym wątku jest to dla mnie w porządku. - tu mój rozszerzony kod:

private bool isRdInstalled() { 
     ManagementObjectSearcher p = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
     foreach (ManagementObject program in p.Get()) { 
      if (program != null && program.GetPropertyValue("Name") != null && program.GetPropertyValue("Name").ToString().Contains("Microsoft Visual Studio 2012 Remote Debugger")) { 
       return true; 
      } 
      if (program != null && program.GetPropertyValue("Name") != null) { 
       Trace.WriteLine(program.GetPropertyValue("Name")); 
      } 
     } 
     return false; 
    } 
5

warto zauważyć, że klasa Win32_Product WMI oznacza produkty, ponieważ są one zainstalowane przez Instalatora Windows [http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].not każda aplikacja okna obsłudze instalator

jednak „SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall "reprezentuje aplikacje dla 32 bitów. W przypadku 64-bitowej wersji należy również przejść przez "HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall", a ponieważ nie każde oprogramowanie ma wersję 64-bitową, wszystkie zainstalowane aplikacje są połączeniem kluczy w obu lokalizacjach z "UninstallString" Wartość z nimi.

ale najlepsze opcje pozostają takie same. Klucze rejestru rejestrów są lepszym rozwiązaniem, ponieważ każda aplikacja ma wpis w rejestrze [łącznie z tymi w Instalatorze Windows] .Jednak metoda rejestru jest niepewna, tak jakby każdy usunął odpowiedni klucz, a następnie nie będziesz znać wpisu aplikacji. Przeciwnie Zmiana ustawień HKEY_Classes_ROOT \ Installers jest trudniejsza, ponieważ wiąże się z problemami z licencjonowaniem, takimi jak pakiet Microsoft Office lub inne produkty. dla bardziej niezawodnego rozwiązania, zawsze możesz połączyć alternatywę rejestru z WMI.

+0

Win32_Product jest złe: https://gregramsey.net/2012/02/20/win32_product-is-evil/ – Mick

4

Zgadzam się, że wyliczanie za pośrednictwem klucza rejestru jest najlepszym sposobem.

Uwaga jednak, że ze względu na klucz, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", będzie lista wszystkich aplikacji w przypadku instalacji 32-bitowego systemu Windows i aplikacji 64-bitowych w instalacji 64-bitowego systemu Windows.

Aby zobaczyć również aplikacje 32-bitowe zainstalowane w 64-bitowej instalacji systemu Windows, należy również wyliczyć klucz @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall".

+0

Jesteś tego pewien? Na moim Windows 10 Enterprise 64bit obie listy wyglądają podobnie, a aplikacje x86 wyświetlają się w obu. –

0

Moje wymogiem jest, aby sprawdzić, czy konkretne oprogramowanie jest zainstalowane w systemie. To rozwiązanie działa zgodnie z oczekiwaniami. To może ci pomóc. Użyłem aplikacji windowsowej w języku C# z visual studio 2015.

private void Form1_Load(object sender, EventArgs e) 
     { 

      object line; 
      string softwareinstallpath = string.Empty; 
      string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
      using (var baseKey = Microsoft.Win32.RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) 
      { 
       using (var key = baseKey.OpenSubKey(registry_key)) 
       { 
        foreach (string subkey_name in key.GetSubKeyNames()) 
        { 
         using (var subKey = key.OpenSubKey(subkey_name)) 
         { 
          line = subKey.GetValue("DisplayName"); 
          if (line != null && (line.ToString().ToUpper().Contains("SPARK"))) 
          { 

           softwareinstallpath = subKey.GetValue("InstallLocation").ToString(); 
           listBox1.Items.Add(subKey.GetValue("InstallLocation")); 
           break; 
          } 
         } 
        } 
       } 
      } 

      if(softwareinstallpath.Equals(string.Empty)) 
      { 
       MessageBox.Show("The Mirth connect software not installed in this system.") 
      } 



      string targetPath = softwareinstallpath + @"\custom-lib\"; 
      string[] files = System.IO.Directory.GetFiles(@"D:\BaseFiles"); 

      // Copy the files and overwrite destination files if they already exist. 
      foreach (var item in files) 
      { 
       string srcfilepath = item; 
       string fileName = System.IO.Path.GetFileName(item); 
       System.IO.File.Copy(srcfilepath, targetPath + fileName, true); 
      } 
      return; 

     } 
Powiązane problemy