Czasami występuje potrzeba znalezienia informacji o tym jakie oprogramowanie jest zainstalowane na komputerze. Przykładowo chcemy się dowiedzieć, czy ktoś ma już zainstalowany dany program i gdzie jest zainstalowany. Wiedza ta jest potrzebna, gdy chcemy dodać przykładowo jakiś plik do katalogu z zainstalowanym już programem. Najprostszym przykładem jest pisanie różnego rodzaju pluginów. Problem nie występuje jeśli aplikacją została zainstalowana w katalogu domyślnym, który znamy, ale tego nie można już zagwarantować.
Aby znaleźć listę programów zainstalowanych na komputerze należy przejrzeć następującą gałąź w rejestrze HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. Kod do przejrzenia tej gałęzi wygląda następująco:
void DisplayInstalledApplications() { string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey)) { var query = from a in key.GetSubKeyNames() let r = key.OpenSubKey(a) select new { Application = r.GetValue("DisplayName"), InstallLocation = r.GetValue("InstallLocation") }; foreach (var item in query) { if (item.Application != null) { Console.WriteLine(item.Application + " - " + item.InstallLocation); } } } }
Przedstawiony powyżej fragment kodu umożliwia wyświetlenie nazwy zainstalowanego program oraz ścieżki do niego. Oczywiście wyświetla on wszystkie programy. W sytuacji gdy interesuje nas konkretny program należy sprawdzić czy nazwa programu jest taka jak nas interesuje.
Przeglądając wpisy w rejestrze w tej gałęzi można znaleźć wiele innych ciekawych informacji o zainstalowanych programach. Są nimi na przykład:
- numer wersji programu,
- data instalacji,
- źródło instalacji,
- ścieżka do uruchomienia instalatora, który zmodyfikuje funkcje zainstalowanego programu,
- ścieżka do uruchomienia instalatora, który odinstaluje zainstalowaną aplikację,
- nazwę producenta aplikacji,
- szacowany rozmiar aplikacji,
- informację, czy zainstalowana aplikacja może być naprawiana lub modyfikowana przez instalator.
Oprócz wymienionych powyżej elementów istnieje jeszcze wiele innych informacji, które można tam znaleźć. Należy tylko pamiętać, że nie wszystkie informacje są dostępne dla wszystkich programów. Dlatego najlepiej sprawdzić przed próbą ich wykorzystania, czy aplikacja, która nas interesuje korzysta z nich.
Taki ładny kod LINQu do generowania listy aplikacji a taki „brzydki” kod do ich wypisania. Nie ładniej tak:
Array.ForEach(query.Where(x => x.Application != null).Select(x => x).ToArray(),
x => Console.WriteLine(string.Format(„{0} -- {1}”, x.Application, x.InstallLocation)));
Pozdrawiam,
Paweł