C#中的Powershell命令

时间:2009-12-19 15:04:46

标签: c# powershell wmi

我正在尝试查询root \ CIMV2名称空间中所有WMI类的名称。有没有办法使用powershell命令在C#中检索此信息?

5 个答案:

答案 0 :(得分:7)

我不确定你为什么提到PowerShell;您可以在纯C#和WMI(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);
}

答案 1 :(得分: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);
            }
        }
    }
}

答案 2 :(得分:4)

请注意,有一个工具可用于创建,运行和保存用PowerShell编写的WMI脚本,PowerShell Scriptomatic工具可从Microsoft TechNet站点下载。

使用此工具,您可以浏览root \ CIMV2或任何其他WMI名称空间中的所有WMI类。

|Image of PowerShell Scriptomatic tool

答案 3 :(得分:3)

您可能希望像Helen一样使用System.Management命名空间,但您也可以在应用程序中托管PowerShell。见http://www.codeproject.com/KB/cs/HowToRunPowerShell.aspx

答案 4 :(得分:3)

就我个人而言,我会选择Helen的方法并消除对PowerShell的依赖。也就是说,这是你在C#中编写代码以使用PowerShell来检索所需信息的方法:

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