Команда Powershell в C#

Я пытаюсь запросить имена все классы WMI в root\CIMV2 пространстве имен. Существует ли способ использовать команду powershell для получения этой информации в C#?

8
задан Sanch01R 19 December 2009 в 15:04
поделиться

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);
            }
        }
    }
}
5
ответ дан 5 December 2019 в 07:35
поделиться

Просто обратите внимание, что есть инструмент, который позволяет создавать, запускать и сохранять WMI-скрипты, написанные в PowerShell, инструмент PowerShell Scriptomatic, доступный для скачивания с сайта Microsoft TechNet. С помощью этого инструмента можно изучить все классы WMI в пространстве имён root\CIMV2 или любом другом пространстве имён WMI.

|Image of PowerShell Scriptomatic tool

4
ответ дан 5 December 2019 в 07:35
поделиться

Лично я бы согласился с подходом Хелен и устранил зависимость от 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);
                }
            }
        }
    }
}
3
ответ дан 5 December 2019 в 07:35
поделиться

Я не уверен, почему вы упомянули 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);
}
7
ответ дан 5 December 2019 в 07:35
поделиться

Вероятно, вы захотите просто использовать пространство имен System.Management, как ответила Хелен, но вы также можете разместить powershell в своем приложении. Смотрите http://www.codeproject.com/KB/cs/HowToRunPowerShell.aspx

3
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: