2009-12-19 9 views
7

Estoy intentando consultar los nombres de todas las clases WMI dentro del espacio de nombres root \ CIMV2. ¿Hay alguna manera de usar un comando powershell para recuperar esta información en C#?Comando Powershell en C#

Respuesta

5

A lo largo de las líneas de acercamiento de 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

No estoy seguro de por qué mencionó PowerShell; puede hacerlo en C# puro y WMI (el espacio de nombre System.Management, eso es).

Para obtener una lista de todas las clases WMI, utilice el SELECT * FROM Meta_Class consulta:

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

Personalmente me gustaría ir con el enfoque de Helen y eliminar tomar una dependencia de PowerShell. Dicho esto, aquí es cómo se codificar esto en C# para utilizar PowerShell para recuperar la información deseada:

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

para notar que hay una herramienta disponible que le permite crear, ejecutar y guardar scripts WMI escritos en PowerShell, la herramienta PowerShell Scriptomatic, disponible para descargar desde el sitio Microsoft TechNet.

Usando esta herramienta, puede explorar todas las clases WMI dentro de la raíz \ CIMV2 o cualquier otro espacio de nombres WMI.

|Image of PowerShell Scriptomatic tool

+0

Esto funciona perfectamente. Gracias por la ayuda. – Sanch01R

Cuestiones relacionadas