Я пытаюсь запросить имена все классы WMI в root\CIMV2 пространстве имен. Существует ли способ использовать команду powershell для получения этой информации в C#?
В соответствии с подходом Кейта
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);
}
}
}
}
Просто обратите внимание, что есть инструмент, который позволяет создавать, запускать и сохранять WMI-скрипты, написанные в PowerShell, инструмент PowerShell Scriptomatic, доступный для скачивания с сайта Microsoft TechNet. С помощью этого инструмента можно изучить все классы WMI в пространстве имён root\CIMV2 или любом другом пространстве имён WMI.
Лично я бы согласился с подходом Хелен и устранил зависимость от 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);
}
}
}
}
}
Я не уверен, почему вы упомянули 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);
}
Вероятно, вы захотите просто использовать пространство имен System.Management, как ответила Хелен, но вы также можете разместить powershell в своем приложении. Смотрите http://www.codeproject.com/KB/cs/HowToRunPowerShell.aspx