2009-12-19 31 views
7

Tôi đang cố truy vấn tên tất cả các lớp WMI trong không gian tên root \ CIMV2. Có cách nào để sử dụng lệnh powershell để lấy thông tin này trong C#?Lệnh Powershell trong C#

Trả lời

5

Dọc theo đường của cách tiếp cận của Keith

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

Tôi không chắc chắn lý do bạn nhắc đến PowerShell; bạn có thể làm điều này trong C# và WMI thuần túy (không gian tên System.Management).

Để có được một danh sách tất cả các lớp WMI, sử dụng truy vấn 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

Cá nhân tôi sẽ đi theo phương pháp của Helen và loại bỏ việc phụ thuộc vào PowerShell. Điều đó nói rằng, đây là cách bạn sẽ mã này trong C# để sử dụng PowerShell để lấy các thông tin mong muốn:

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

Chỉ cần lưu ý rằng có một công cụ có sẵn mà cho phép bạn tạo, chạy và lưu các tập lệnh WMI được viết bằng PowerShell, công cụ PowerShell Scriptomatic, có sẵn để tải xuống từ trang web Microsoft TechNet.

Sử dụng công cụ này, bạn có thể khám phá tất cả các lớp WMI bên trong thư mục gốc \ CIMV2 hoặc bất kỳ vùng tên WMI nào khác.

|Image of PowerShell Scriptomatic tool

+0

Điều này hoạt động hoàn hảo. Cảm ơn đã giúp đỡ. – Sanch01R

Các vấn đề liên quan