2009-05-26 24 views

उत्तर

88

रजिस्ट्री कुंजी "सॉफ़्टवेयर Microsoft \ Windows \ CurrentVersion \ स्थापना रद्द करें \" के माध्यम से बार-बार दोहराना स्थापित अनुप्रयोगों की एक व्यापक सूची देने के लिए लगता है।

नीचे दिए गए उदाहरण के अलावा, आप here पर किए गए एक समान संस्करण को पा सकते हैं।

यह एक मोटा उदाहरण है, आप प्रोबबी प्रदान किए गए दूसरे लिंक की तरह रिक्त पंक्तियों को बाहर निकालने के लिए कुछ करना चाहते हैं। , हालांकि

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

लेकिन इस पर अमल करने के बजाय धीमी है, और मैंने सुना है कि यह केवल "ALLUSERS" के तहत स्थापित कर सकते हैं सूची के कार्यक्रम:

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")); 
     } 
    } 
} 

वैकल्पिक रूप से, आप WMI के रूप में उल्लेख किया गया है का उपयोग कर सकते यह गलत हो सकता है। यह विंडोज घटक & अद्यतनों को भी अनदेखा करता है, जो आपके लिए आसान हो सकता है।

+20

अगर आप इस क्वेरी को बार-बार चलाना चाहते हैं यह ध्यान देने योग्य है कि WMI Win32_Product वर्ग का उपयोग कर एक बुरा विचार है लायक है। इस Microsoft KB लेख देखें: http://support.microsoft.com/kb/974524/EN-US कोर समस्या (क) Win32_Product वास्तव में धीमी है और (ख) यह उत्पन्न करता है एक "Windows इंस्टालर उत्पाद पुन: कॉन्फ़िगर । " आपके सिस्टम पर * हर * स्थापित उत्पाद के लिए इवेंट लॉग संदेश ... हर बार जब आप क्वेरी चलाते हैं। रवींद्र! यह आलेख Win32reg_AddRemovePrograms क्लास का उपयोग करने की अनुशंसा करता है ... जो तब तक मौजूद नहीं है जब तक कि आपने एसएमएस इंस्टॉल नहीं किया हो। रवींद्र! तो शायद रजिस्ट्री क्वेरी के साथ चिपकने के लिए बेहतर है। –

+0

साइमन गिलबी की टिप्पणी स्वीकार्य उत्तर, या कीर्तन होना चाहिए! WMI WIN32_Product यहां जाने का तरीका नहीं है, मेरा विश्वास करो! – bdd

+8

एर, यही कारण है कि रजिस्ट्री उदाहरण मेरे उत्तर में सबसे पहले है। डब्लूएमआई को एक वैकल्पिक समाधान के रूप में प्रस्तुत किया गया था, और यहां तक ​​कि वहां भी मैं कहता हूं "यह निष्पादित करने के लिए धीमा है" और अन्य कमियां। शुरुआत से जवाब पढ़ें। ;) – Xiaofu

0

आपकी सर्वश्रेष्ठ शर्त WMI का उपयोग करना है। विशेष रूप से Win32_Product कक्षा।

+2

शायद धीमा हो सकता है? – Kiquenet

+0

इस का उपयोग न: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

"HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ माइक्रोसॉफ्ट \ विंडोज \ CurrentVersion \ अनइंस्टॉल करें" कुंजी के माध्यम से Iterate और उनके "DisplayName" मानों की जांच करें।

10

आप this article पर एक नज़र डाल सकते हैं। यह स्थापित अनुप्रयोगों की सूची को पढ़ने के लिए रजिस्ट्री का उपयोग करता है।

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

मैं पूरी सूची नहीं करना चाहती, मैं सिर्फ कुछ चयनित जरूरत प्रोग्राम इंस्टॉल तो क्या मैं उस के लिए कर सकते हैं। धन्यवाद –

1

मैं तुम्हें WMI (Windows Management Instrumentation) पर एक नज़र डालें सुझाव दे सकता है। यदि आप सिस्टम को जोड़ते हैं। आपके सी # प्रोजेक्ट के प्रबंधन का संदर्भ, आपको कक्षा 'प्रबंधन ऑब्जेक्ट खोजकर्ता' तक पहुंच प्राप्त होगी, जिसे आप शायद उपयोगी पाएंगे।

Installed Applications के लिए विभिन्न WMI क्लासेस हैं, लेकिन यदि यह विंडोज इंस्टालर के साथ स्थापित किया गया था, तो Win32_Product क्लास शायद आपके लिए सबसे उपयुक्त है।

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

न का उपयोग करें: https://stackoverflow.com/a/46315976/1498669 – Bernhard

1

विंडोज इंस्टालर एपीआई का उपयोग करें!

यह सभी कार्यक्रमों के विश्वसनीय गणना करने की अनुमति देता है। रजिस्ट्री विश्वसनीय नहीं है, लेकिन डब्लूएमआई हेवीवेट है।

+0

निश्चित रूप से भारी वजन है - यदि बार-बार चलते हैं, तो एक भारी वजन की तरह प्रदर्शन बूंदों को देखेंगे। यदि मेरे ऐप की एक विशेषता किसी अन्य ऐप पर निर्भर करती है, और पता है कि सही तरीके से इंस्टॉल किया गया है, तो मुझे 32 या 64 के लिए केवल अनइंस्टॉल रजिस्ट्री कुंजी की आवश्यकता है यदि ऐप 64 बिट में भी लाभ उठाता है) दूसरी तरफ यदि मुझे अवश्य ही Wmi का उपयोग करें, मैं एक स्मार्ट संपत्ति चाल के माध्यम से एक आवेदन के दौरान केवल एक बार उपयोग करने के लिए सीमित कर देंगे। – gg89

1

मैंने निक्स दृष्टिकोण का उपयोग किया - मुझे यह जांचने की आवश्यकता है कि विजुअल स्टूडियो के लिए दूरस्थ उपकरण स्थापित हैं या नहीं, यह थोड़ा धीमा लगता है, लेकिन एक अलग धागे में यह मेरे लिए ठीक है। - यहाँ मेरी विस्तारित कोड:

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

यह ध्यान देने योग्य है कि Win32_Product WMI वर्ग उत्पादों का प्रतिनिधित्व करता है के रूप में वे Windows इंस्टालर [http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].not हर आवेदन उपयोग Windows इंस्टालर के द्वारा स्थापित कर रहे हैं लायक है

तथापि "सॉफ़्टवेयर Microsoft \ Windows \ CurrentVersion \ \ अनइंस्टॉल "32 बिट के लिए अनुप्रयोगों का प्रतिनिधित्व करता है। 64 बिट के लिए आपको "HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall" को पार करने की भी आवश्यकता है और चूंकि प्रत्येक सॉफ़्टवेयर में 64 बिट संस्करण नहीं है, इसलिए कुल एप्लिकेशन इंस्टॉल किए गए सभी स्थानों पर कुंजी का एक संघ है जो "अनइंस्टॉलस्ट्रिंग" है उनके साथ मूल्य।

लेकिन सबसे अच्छे विकल्प समान हैं। ट्रैवर्स रजिस्ट्री कुंजियां एक बेहतर तरीका है क्योंकि प्रत्येक एप्लिकेशन में रजिस्ट्री में एक प्रविष्टि है [विंडोज इंस्टालर में शामिल हैं]। हालांकि रजिस्ट्री विधि असुरक्षित है जैसे कोई भी संबंधित कुंजी को हटा देता है आप एप्लिकेशन एंट्री नहीं जान पाएंगे। इसके विपरीत HKEY_Classes_ROOT \ इंस्टॉलर्स को बदलना अधिक मुश्किल है क्योंकि यह माइक्रोसॉफ्ट ऑफिस या अन्य उत्पादों जैसे लाइसेंसिंग मुद्दों से जुड़ा हुआ है। अधिक मजबूत समाधान के लिए आप हमेशा WMI के साथ रजिस्ट्री विकल्प को जोड़ सकते हैं।

+0

Win32_Product बुरा है: https://gregramsey.net/2012/02/20/win32_product-is-evil/ – Mick

4

मैं मानता हूँ कि रजिस्ट्री कुंजी के माध्यम से गणना का सबसे अच्छा तरीका है।

नोट, तथापि, कि कुंजी दी, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", एक 32-बिट Windows स्थापना में सभी आवेदनों को एक Windows 64-बिट स्थापना में 64 बिट अनुप्रयोगों की सूची बनाना, और होगा।

विंडोज 64-बिट स्थापना पर स्थापित 32-बिट अनुप्रयोगों को देखने के लिए, आपको कुंजी @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" पर भी गणना करने की आवश्यकता होगी।

+0

क्या आप इस बारे में निश्चित हैं? मेरे विंडोज 10 एंटरप्राइज़ 64 बिट पर दो सूचियां समान दिखती हैं और x86 एप्लिकेशन दोनों में दिखाई देते हैं। –

0

मेरे आवश्यकता है, तो विशिष्ट सॉफ्टवेयर अपने सिस्टम में स्थापित किया गया है की जाँच करने के लिए है। यह समाधान अपेक्षित के रूप में काम करता है। यह आपकी मदद कर सकता है। मैंने दृश्य स्टूडियो 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; 

     } 
संबंधित मुद्दे