簡體   English   中英

C#中的Powershell命令

[英]Powershell Command in C#

我試圖查詢root \\ CIMV2名稱空間中的所有WMI類的名稱。 有沒有辦法使用powershell命令在C#中檢索此信息?

我不確定你為什么提到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);
}

沿着基思的方法

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

請注意,有一個工具可用於創建,運行和保存用PowerShell編寫的WMI腳本, PowerShell Scriptomatic工具可從Microsoft TechNet站點下載。

使用此工具,您可以瀏覽root \\ CIMV2或任何其他WMI命名空間中的所有WMI類。

| PowerShell Scriptomatic工具的圖像

您可能希望像Helen一樣使用System.Management命名空間,但您也可以在應用程序中托管PowerShell。 請參閱http://www.codeproject.com/KB/cs/HowToRunPowerShell.aspx

就個人而言,我會采用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);
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM