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


Получение класса WMI

Первый тип объекта, который можно получить, — это класс WMI. При получении класса WMI фактически извлекается определение класса, которое является описанием свойств, квалификаторов и методов, которые полностью описывают класс. Однако определение класса в основном является самим классом.

PowerShell использует стандартный запрос для получения определений классов с помощью класса meta_class.

Получение определения класса в PowerShell

  • Используйте Get-WmiObject с запросом к meta_classс условием WHERE, содержащим имя класса, который вы хотите получить.

    Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
    

    Get-WmiObject — это стандартный командлет PowerShell, который используется для извлечения информации о классе и экземпляре из WMI. Класс meta_class определяет запрос как запрос схемы. Без класса meta_class этот запрос вернет все экземпляры Win32_LogicalDisk. Дополнительные сведения о запросе WMI см. в инструкции SELECT для запросов схемы.

Текущий процесс получения определения WMI в C# — использовать класс CIMInstance.

Получение определения класса в C# (Microsoft.Management.Infrastructure)

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

    Созданный класс будет содержать всю информацию о классе, но без данных экземпляра.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. Кроме того, как и в PowerShell, можно также выполнить запрос, используя тег meta_class в рамках запроса.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'";
    
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    

Как и в PowerShell, C# использует запрос meta_class для получения определений классов. Кроме того, можно создать объект ManagementClass для прямого доступа к определению класса.

Заметка

System.Management — исходное пространство имен .NET, используемое для доступа к WMI; однако API в этом пространстве имен, как правило, медленнее и не масштабируются так хорошо относительно их более современных Microsoft.Management.Infrastructure альтернатив.

 

Получение определения класса в C# (System.Management)

  1. Вы можете использовать ManagementObjectSearcher с запросом к meta_classи условием WHERE, содержащим имя класса, который вы хотите получить.

    using System.Management;
    ...
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'");
    ManagementObjectCollection myDiskCollection = searcher.Get();
    

    ManagementObjectSerarcher — это стандартный класс .NET, который используется для получения сведений о классах и экземплярах из WMI. ManagementObjectSerarcher.Get возвращает ManagementObjectCollection, содержащую класс определения схемы. Класс meta_class определяет запрос как запрос схемы. Без класса meta_class этот запрос вернет все экземпляры Win32_LogicalDisk. Дополнительные сведения о запросе WMI см. в инструкции SELECT для запросов схемы.

  2. В качестве альтернативы создайте новый объект ManagementClass, используя имя как путь, чтобы получить класс.

    using System.Management;
    ...
    ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
    

Определение класса в VBScript можно получить аналогично получению конкретного экземпляра класса.

Получение определения класса в VBScript

  1. Вызовите SWbemServices.Get, но не указывайте конкретный экземпляр в пути объекта этого класса.

  2. В следующем примере кода извлекается определение класса для класса, описывающего логические диски на компьютере.

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Среда Windows Script Host (WSH) также поддерживает следующее.

    <OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
    

    На страницах Active Server (ASP) используйте GetObject или CreateObject в скрипте на стороне сервера. Для получения дополнительной информации см. статью «Создание активных серверных страниц для WMI».

  3. Можно также указать класс или экземпляр, в этом случае возвращаемый объект является объектом WMI, например экземпляром Win32_LogicalDisk, а не объектом служб. Обратите внимание, что функции VBScript GetObject нельзя использовать для создания экземпляра универсального объекта SWbemObject.

  4. На HTML-страницах, работающих в Microsoft Internet Explorer (IE), GetObject и CreateObject могут завершиться ошибкой, так как объекты скриптов WMI, такие как элементы ActiveX, не помечены как безопасные для сценариев. Одним из исключений является объект SWbemDateTime. Единственным способом успешного выполнения этих вызовов является снижение параметров безопасности IE, которое не рекомендуется.

При получении класса в C++ вызовите версию IWbemServicesGetObject.

Получение определения класса в C++

  1. Вызовите методы IWbemServices::GetObject или IWbemServices::GetObjectAsync, чтобы получить определение класса.
  2. Один класс может иметь несколько определений классов, что обычно происходит при загрузке нескольких поставщиков классов в одно пространство имен. Если класс содержит несколько определений классов, WMI возвращает первое определение, обнаруженное и код состояния WBEM_S_DUPLICATE_OBJECTS.

Так как GetObject возвращает определение класса, оно обычно используется в качестве первого шага при создании экземпляра. Для получения дополнительной информации об использовании GetObjectсм. раздел Создание и объявление экземпляра с использованием C++.