2009-12-19 3 views
7

में पावरहेल कमांड मैं रूट \ CIMV2 नामस्थान के भीतर सभी WMI कक्षाओं के नामों से पूछताछ करने का प्रयास कर रहा हूं। क्या सी # में इस जानकारी को पुनः प्राप्त करने के लिए powerhell कमांड का उपयोग करने का कोई तरीका है?सी #

उत्तर

5

कीथ के दृष्टिकोण की पंक्तियों के साथ

using System; 
using System.Management.Automation; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var script = @" 
       Get-WmiObject -list -namespace root\cimv2 | Foreach {$_.Name} 
      "; 

      var powerShell = PowerShell.Create(); 
      powerShell.AddScript(script); 

      foreach (var className in powerShell.Invoke()) 
      { 
       Console.WriteLine(className); 
      } 
     } 
    } 
} 
7

मुझे यकीन नहीं है कि आपने PowerShell का उल्लेख क्यों किया है; आप इसे शुद्ध सी # और डब्लूएमआई (System.Management नेमस्पेस में कर सकते हैं, जो है)।

सभी WMI वर्गों की एक सूची प्राप्त, SELECT * FROM Meta_Class क्वेरी का उपयोग करने के लिए:

using System.Management; 
... 

try 
{ 
    EnumerationOptions options = new EnumerationOptions(); 
    options.ReturnImmediately = true; 
    options.Rewindable = false; 

    ManagementObjectSearcher searcher = 
     new ManagementObjectSearcher("root\\cimv2", "SELECT * FROM Meta_Class", options); 

    ManagementObjectCollection classes = searcher.Get(); 

    foreach (ManagementClass cls in classes) 
    { 
     Console.WriteLine(cls.ClassPath.ClassName); 
    } 
} 
catch (ManagementException exception) 
{ 
    Console.WriteLine(exception.Message); 
} 
3

आप शायद सिर्फ System.Management नाम स्थान का उपयोग करने के हेलेन की तरह जवाब चाहते हैं, लेकिन आप भी भीतर powershell होस्ट कर सकते हैं अपने आवेदन। देखें

3

व्यक्तिगत रूप से मैं हेलेन के दृष्टिकोण के साथ जाऊंगा और पावरशेल पर निर्भरता को खत्म कर दूंगा।

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Management.Automation; 

namespace RunspaceInvokeExp 
{ 
    class Program 
    { 
     static void Main() 
     { 
      using (var invoker = new RunspaceInvoke()) 
      { 
       string command = @"Get-WmiObject -list -namespace root\cimv2" + 
            " | Foreach {$_.Name}"; 
       Collection<PSObject> results = invoker.Invoke(command); 
       var classNames = results.Select(ps => (string)ps.BaseObject); 
       foreach (var name in classNames) 
       { 
        Console.WriteLine(name); 
       } 
      } 
     } 
    } 
} 
4

बस नोट करने के लिए एक उपकरण है कि उपलब्ध है कि वहाँ: यह कहा, आपके द्वारा PowerShell का उपयोग करने के लिए वांछित जानकारी प्राप्त करने में सी # में इस कोड होता है आपको Microsoft TechNet साइट से डाउनलोड करने के लिए उपलब्ध PowerShell, PowerShell Scriptomatic टूल में लिखी गई WMI स्क्रिप्ट्स बनाने, चलाने और सहेजने की अनुमति देता है।

इस उपकरण का उपयोग करके, आप रूट \ CIMV2 या किसी अन्य WMI नामस्थान के भीतर सभी WMI कक्षाओं का पता लगा सकते हैं।

|Image of PowerShell Scriptomatic tool

+0

यह पूरी तरह से काम करता है। सहायता के लिए धन्यवाद। – Sanch01R