Поделиться через


Получение экземпляра 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)

  1. Используя пространство имен Microsoft.Management.Infrastructure, создайте новый объект CimInstance с соответствующим именем класса и пространством имен.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance myDrive = new CimInstance(className, Namespace);
    
  2. Создайте CimProperty, содержащую имя и значение ключевого свойства экземпляра, который вы хотите найти, и добавьте это свойство в объект класса.

    myDrive.CimInstanceProperties.Add(CimProperty.Create("DeviceID", "C:", CimFlags.Key));
    
  3. Извлеките объект из 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)

  1. Получите локальную копию конкретного экземпляра, создав новую managementObjectс именем и значением конкретного экземпляра, переданным, хотя параметр ManagementPath. Затем можно получить данные экземпляра, явно вызвав ManagementObject.Get.

    using System.Management;
    ...
    ManagementObject objInst = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    objInst.Get();
    
  2. В качестве альтернативы, можно получить все экземпляры класса 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.