Получение экземпляра WMI
Получение объекта является одной из наиболее распространенных процедур получения данных, которые вы, скорее всего, будете выполнять в WMI. Можно получить существующий экземпляр или создать новый неименованный экземпляр. Путь WMI к существующему экземпляру является обязательным параметром. Дополнительные сведения см. в разделе Описание расположения объекта WMI.
Заметка
При предоставлении экземпляра поставщик может не иметь возможности указать значение для определенных свойств. Если иное не указано в описании свойства, вы не можете вывести какое-либо значение из пустого значения. Это не следует путать со строкой, которая имеет значение NULL. В этом случае значение заполняется. Он пуст, но имеет значение: NULL.
Получите локальную копию объекта с помощью вызова командлета PowerShell Get-WmiObject.
Получение экземпляра класса WMI с помощью PowerShell
Вы можете получить определенные экземпляры с помощью параметров класса и -filter.
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
Экземпляр WMI можно получить с помощью C# путем создания объекта поиска с помощью CimInstance, а затем заполнения соответствующими значениями ключей, а затем поиска этого объекта с помощью вызова CimSession.GetInstance.
Получение экземпляра класса WMI с помощью C# (Microsoft.Management.Infrastructure)
Используя пространство имен Microsoft.Management.Infrastructure, создайте новый объект CimInstance с соответствующим именем класса и пространством имен.
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string className = "Win32_LogicalDisk"; CimInstance myDrive = new CimInstance(className, Namespace);
Создайте CimProperty, содержащую имя и значение ключевого свойства экземпляра, который вы хотите найти, и добавьте это свойство в объект класса.
myDrive.CimInstanceProperties.Add(CimProperty.Create("DeviceID", "C:", CimFlags.Key));
Извлеките объект из WMI с помощью вызова CimSession.GetInstance.
CimSession mySession = CimSession.Create("localhost"); CimInstance searchInstance = mySession.GetInstance(Namespace, myDrive);
Можно получить определенный экземпляр класса WMI или коллекцию экземпляров классов WMI, используя классы в пространстве имен System.Management.
Заметка
System.Management — исходное пространство имен .NET, используемое для доступа к WMI; однако API в этом пространстве имен обычно медленнее и не масштабируются так же хорошо по сравнению с их более современными Microsoft.Management.Infrastructure коллегами.
Как получить экземпляр класса WMI с помощью C# (System.Management)
Получите локальную копию конкретного экземпляра, создав новую managementObjectс именем и значением конкретного экземпляра, переданным, хотя параметр ManagementPath. Затем можно получить данные экземпляра, явно вызвав ManagementObject.Get.
using System.Management; ... ManagementObject objInst = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'"); objInst.Get();
В качестве альтернативы, можно получить все экземпляры класса WMI, используя ManagementObjectSearcherдля поиска, а потом перечислить все элементы в возвращенной коллекции ManagementObjectCollection.
using System.Management; ... ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"); ManagementObjectCollection colDisks = mgmtObjSearcher.Get(); foreach (ManagementObject objDisk in colDisks) { Console.WriteLine("Device ID : {0}", objDisk["DeviceID"]); } Console.ReadLine();
Вы можете неявно вызвать метод Get путем доступа к экземпляру. Для получения дополнительной информации см. раздел Извлечение части экземпляра WMI.
Получите локальную копию экземпляра, вызвав метод GetObject языка VBScript.
Чтобы получить экземпляр класса WMI с помощью VBScript
Вызовите GetObject с путем объекта экземпляра, как показано в следующем примере.
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk='C:'")
Получение конкретного экземпляра требует указания имени в составе пути к объекту.
В C++вызовите IWbemServices::GetObject.
Получение экземпляра класса WMI с помощью C++
Получите локальную копию экземпляра, используя вызов IWbemServices::GetObject или IWbemServices::GetObjectAsync. Путь WMI к объекту должен быть указан.
Как подразумевает имя, GetObjectAsync получает экземпляр асинхронно, а GetObject извлекает экземпляр синхронно. Если вы хотите использовать асинхронное извлечение, необходимо реализовать интерфейс IWbemObjectSink.