Получение класса 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. Вы можете использовать ManagementObjectSerarcher с запросом для 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 (WSH) также поддерживает следующее.

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

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

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

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

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

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

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

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