Доступ к экземплярам WMI через MI без службы WS-Management - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь получить доступ к классам WMI в Windows 7 и Windows 10 Embedded на локальном хосте через API-интерфейс Microsoft.Management.Infrastructure из C #.Он работает с использованием кода из приведенного ниже фрагмента, но только если я запускаю службу удаленного управления Windows (WS-Management).

Я заметил, что могу получить доступ к классам с помощью командлетов Powershell, таких как Get-WmiObject, даже когда служба WS-Management не запущена.Есть ли способ получить доступ к WMI без запуска службы через API-интерфейсы Microsoft Management Infrastructure?

CimSession cimSession = CimSession.Create("localhost");
IEnumerable<CimInstance> enumeratedInstances = cimSession.EnumerateInstances(@"root\cimv2", "Win32_Process");
foreach (CimInstance cimInstance in enumeratedInstances)
{
    Console.WriteLine("{0}", cimInstance.CimInstanceProperties[ "Name" ].Value.ToString());
}

Ответы [ 2 ]

0 голосов
/ 10 августа 2018

Итак, я столкнулся с той же проблемой.Чтобы добавить к этому, Windows.Management.Instrumentation недоступен в .NET Core, но Microsoft.Management.Infrastructure - это.

С помощью большого количества поисков в Google я наконец нашел варианты, которые работают.Кажется, что для настройки локального сеанса вы должны использовать параметры сеанса DCOM.

Вот код, который работал для меня:

var sessionOptions = new DComSessionOptions
{
    Timeout = TimeSpan.FromSeconds(30)
};
var cimSession = CimSession.Create("localhost", sessionOptions);

var volumes = cimSession.QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_Volume");

foreach (var volume in volumes)
{
    Console.WriteLine(volume.CimInstanceProperties["Name"].Value);
}
0 голосов
/ 08 июня 2018

Если вы работаете локально, вы всегда должны иметь доступ к WMI.Из документации MSDN:

WMI работает как служба с отображаемым именем «Инструментарий управления Windows» и именем службы «winmgmt».WMI запускается автоматически при запуске системы под учетной записью LocalSystem.Если WMI не работает, он автоматически запускается, когда первое управляющее приложение или скрипт запрашивает подключение к пространству имен WMI.

Вы также можете использовать библиотеку ORMi (очень простую в использовании)для WMI для автоматического отображения между классами WMI и моделями C #.

[WMIClass("Win32_Process")]
public class Process
{
    public string Name { get; set; }
    public string Description { get; set; }
}

Затем запрос:

WMIHelper helper = new WMIHelper("root\\CimV2");

List<Process> process = helper.Query<Process>().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...