Come ottenere le applicazioni installate nel sistema usando il codice C#?Ottenere le applicazioni installate in un sistema
risposta
Iterando attraverso la chiave di registro "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" sembra dare una lista completa delle applicazioni installate.
A parte l'esempio riportato di seguito, è possibile trovare una versione simile a quello che ho fatto here.
Questo è un esempio di massima, avrete probaby vogliono fare qualcosa per togliere righe vuote come nel 2 ° link fornito.
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"));
}
}
}
In alternativa, è possibile utilizzare WMI come è stato detto:
ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
foreach(ManagementObject mo in mos.Get())
{
Console.WriteLine(mo["Name"]);
}
Ma questo è piuttosto lento per l'esecuzione, e ho sentito che può solo i programmi della lista installato sotto "ALLUSERS", anche se potrebbe non essere corretto Ignora anche gli aggiornamenti di componenti di Windows &, che possono essere utili per te.
La soluzione migliore è utilizzare WMI. In particolare la classe Win32_Product.
Iterare attraverso le chiavi "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" e controllare i loro valori "DisplayName".
È possibile dare un'occhiata a this article. Usa il registro per leggere l'elenco delle applicazioni installate.
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)
{ }
}
}
}
}
Non voglio l'intero elenco, ho solo bisogno di alcuni programmi di installazione selezionati, quindi cosa posso fare per quello. Grazie –
Potrei suggerire di dare un'occhiata a WMI (Windows Management Instrumentation). Se aggiungi il riferimento System.Management al tuo progetto C#, avrai accesso alla classe `ManagementObjectSearcher ', che probabilmente troverai utile.
Esistono varie classi WMI per Installed Applications, ma se è stato installato con Windows Installer, la classe Win32_Product è probabilmente la più adatta a voi.
ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
non utilizzare questo: https://stackoverflow.com/a/46315976/1498669 – Bernhard
Utilizzare l'API di Windows Installer!
permette di fare l'enumerazione affidabile di tutti i programmi. Il registro non è affidabile, ma WMI è pesante.
è molto pesante - se eseguito ripetutamente, si vedrà un calo delle prestazioni come un peso elevato. se una funzione della mia app dipende da un'altra app, e sapere se è installata correttamente, ho solo bisogno della chiave di registro di disinstallazione per 32 o 64 solo se l'app è disponibile anche a 64 bit) d'altra parte se devo usare wmi, mi limiterò a usare una sola volta durante un'applicazione tramite un trucco di proprietà intelligente. – gg89
ho usato l'approccio Nicks - avevo bisogno di verificare se i Remote Tools per Visual Studio vengono installati o no, mi sembra un po 'lento, ma in un thread separato Questo va bene per me. - qui il mio codice esteso:
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;
}
vale la pena notare che la classe Win32_Product WMI rappresenta i prodotti in cui sono installati da Windows Installer [http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].not ogni applicazione utilizza Windows Installer
tuttavia "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall "rappresenta le applicazioni per 32 bit. Per 64 bit è anche bisogno di attraversare "HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall" e dal momento che non tutti i software ha una versione a 64 bit il totale delle domande installate sono un'unione di chiavi su entrambe le posizioni che hanno "UninstallString" Valore con loro.
ma le migliori opzioni rimangono le stesse chiavi di registro .verso è un approccio migliore poiché ogni applicazione ha una voce nel Registro di sistema [inclusi quelli in Windows Installer]. Tuttavia il metodo di registro non è sicuro come se qualcuno rimuovesse la chiave corrispondente non si conoscerà la voce Applicazione. Al contrario, la modifica degli HKEY_Classes_ROOT \ Installers è più complicata in quanto è collegata a problemi di licenza come Microsoft Office o altri prodotti. per soluzioni più solide è sempre possibile combinare l'alternativa di registro con il WMI.
Win32_Product è malvagio: https://gregramsey.net/2012/02/20/win32_product-is-evil/ – Mick
Sono d'accordo che l'enumerazione tramite la chiave di registro sia il modo migliore.
Nota, tuttavia, che la chiave dato, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
, elencherà tutte le applicazioni in un'installazione di Windows a 32 bit, e le applicazioni a 64 bit in un'installazione di Windows a 64 bit.
Per visualizzare anche le applicazioni a 32 bit installate su un'installazione di Windows a 64 bit, è necessario anche eseguire il conteggio della chiave @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
.
Sei sicuro di questo? Sul mio Windows 10 Enterprise 64bit i due elenchi si assomigliano e le applicazioni x86 si presentano in entrambi. –
Il mio requisito è controllare se nel mio sistema è installato software specifico. Questa soluzione funziona come previsto. Potrebbe aiutarti. Ho usato un'applicazione Windows in C# con 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. Ottenere elenco di tutte le applicazioni installate in ios 8
- 2. Android Come ottenere le versioni locali installate del sistema
- 3. Dove iPhone Simulator memorizza le applicazioni installate?
- 4. percorso del Registro di trovare tutte le applicazioni installate
- 5. Ottieni l'elenco delle applicazioni Android installate
- 6. ottenere l'elenco delle applicazioni installate su iphone objective-c
- 7. enumerare tutte le applicazioni installate sul OS X
- 8. Ottieni un elenco di tutte le applicazioni installate in Django e i loro attributi
- 9. Elenco di applicazioni Web installate in Apache Tomcat
- 10. Ottieni l'elenco di tutte le app installate
- 11. Ottenere un elenco di tutte le applicazioni
- 12. Categorizza le applicazioni
- 13. Controllo delle versioni del database nelle applicazioni installate usando Delphi
- 14. Le applicazioni in stile Metro potranno essere installate al di fuori del mercato?
- 15. Come ottenere un elenco di tutte le app di routing installate?
- 16. Come posso elencare/elencare tutte le applicazioni installate in Windows XP?
- 17. Come ottenere l'elenco delle applicazioni in esecuzione?
- 18. Sistema di contabilità per le applicazioni Winforms/SQL Server
- 19. Nuget Le dipendenze non vengono installate
- 20. Dove installa le app installate sul dispositivo?
- 21. Un approccio aggiornabile per progettare un sistema di applicazioni Web
- 22. Desidero utilizzare le applicazioni Java in un hardware incorporato
- 23. Come ottenere l'elenco di tutte le scorciatoie installate trovate nella schermata iniziale Launcher in Android
- 24. Come ottenere tutte le icone di sistema in Xcode
- 25. Come ottenere applicazioni in esecuzione in Windows?
- 26. C# Windows Form Le applicazioni in Mac
- 27. Filtra le app non riscritte quando ricevi tutte le app installate
- 28. Come distribuire le applicazioni VB6?
- 29. Dimensioni ottimali per le applicazioni per le applicazioni mobili
- 30. Come verificare che le patch Oracle siano installate?
Vale la pena notare che l'utilizzo della classe WMI Win32_Product è una cattiva idea se si prevede di eseguire questa query ripetutamente. Vedere questo articolo della Microsoft KB: http://support.microsoft.com/kb/974524/EN-US Il problema principale è il (a) Win32_Product è molto lento e (b) genera un "Windows Installer riconfigurato il prodotto ". messaggio del registro eventi per * ogni * prodotto installato sul sistema ... ogni volta che si esegue la query. Doh! Questo articolo consiglia di utilizzare la classe Win32reg_AddRemovePrograms ... che non è presente a meno che non sia stato installato SMS. Doh! Quindi probabilmente è meglio attenersi alla query del registro. –
Il commento di Simon Gillbee dovrebbe essere la risposta accettata, o Kirtans! WMI WIN32_Product non è il modo per andare qui, fidati di me! – bdd
Er, ecco perché l'esempio del registro è il primo nella mia risposta. WMI è stato presentato semplicemente come una soluzione alternativa, e anche in questo caso dichiaro che "questo è piuttosto lento da eseguire" e altri svantaggi. Leggi la risposta dall'inizio. ;) – Xiaofu