Jak zainstalować aplikacje w systemie przy użyciu kodu C#?Instalowanie aplikacji w systemie
Odpowiedz
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.
Najlepiej jest użyć numeru WMI. W szczególności klasa Win32_Product.
Powtórz klucze "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" i sprawdź ich wartości "DisplayName".
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)
{ }
}
}
}
}
Nie chcę całej listy, potrzebuję tylko wybranych programów instalacyjnych, więc co mogę zrobić dla tego. Dziękuję –
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");
nie korzystać z tego: https://stackoverflow.com/a/46315976/1498669 – Bernhard
Użyj interfejsu Windows Installer API!
Pozwala to na rzetelne wyliczenie wszystkich programów. Rejestr nie jest wiarygodny, ale WMI jest waga ciężka.
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
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;
}
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.
Win32_Product jest złe: https://gregramsey.net/2012/02/20/win32_product-is-evil/ – Mick
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"
.
Jesteś tego pewien? Na moim Windows 10 Enterprise 64bit obie listy wyglądają podobnie, a aplikacje x86 wyświetlają się w obu. –
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;
}
- 1. Instalowanie aplikacji CodeIgniter w podfolderze
- 2. Instalowanie kompilatorów C/C++ w systemie Android
- 3. Instalowanie środowiska Python/Sphinx w systemie Windows?
- 4. Szyny w systemie Windows - instalowanie wydania
- 5. Instalowanie okna dokowanego w systemie Ubuntu 16.10
- 6. Instalowanie OSQA w systemie Windows (lokalny system)
- 7. Instalowanie wtyczki patogenu vim w systemie Windows
- 8. Instalowanie gensim w systemie Windows 7
- 9. Instalowanie buforów protokołów w systemie Windows
- 10. Android Wstępne instalowanie aplikacji NDK
- 11. Instalowanie aplikacji demo Yii 2
- 12. Instalowanie aplikacji Facebook APK w Genymotion
- 13. Instalowanie modułów Perla na systemie Android OS
- 14. Instalowanie aplikacji internetowej za pomocą Wix
- 15. instalowanie pakietu z lokalnego pliku .tar.gz w systemie Linux
- 16. Instalowanie Emacsa na terminalu w systemie operacyjnym Chrome
- 17. Instalowanie programu Navicat w systemie Ubuntu 14.04 LTS
- 18. Instalowanie obsługi Java w systemie Windows 7 z NSSM
- 19. Python PyPotrace Potrace Instalowanie w systemie Windows - Windows10
- 20. Instalowanie sterownika USB systemu Android w systemie Windows 7
- 21. Instalowanie modułów binarnych Pythona do niestandardowej lokalizacji w systemie Windows
- 22. Instalowanie aplikacji iOS z lokalnego pliku plist (null) chce zainstalować
- 23. Instalowanie certyfikatów klienta w aplikacjach XAML aplikacji Sklep Windows
- 24. Instalowanie wxPython w virtualenv pod Linuxem
- 25. Instalowanie paska narzędziowego Heroku na systemie Windows 10
- 26. Instalowanie wstępnie skompilowanego pliku binarnego na systemie Android: "nie znaleziono"
- 27. Instalowanie pliku PIL na systemie OS X Lion (pełny noob)
- 28. Instalowanie GD w Dockerze
- 29. Instalowanie AndEngine w Eclipse
- 30. Instalowanie Laravel w podfolderze
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. –
Komentarz Simona Gillbee'a powinien być zaakceptowaną odpowiedzią, czyli Kirtanami! WMI WIN32_Produkt nie jest sposobem, aby przejść tutaj, zaufaj mi! – bdd
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