Получение класса 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)
С помощью пространства имен Microsoft.Management.Infrastructure создайте класс CIMInstance с указанным пространством имен и именем класса.
Созданный класс будет содержать все сведения о классе, но не данные экземпляра.
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string className = "Win32_LogicalDisk"; CimInstance diskDrive = new CimInstance(className, Namespace);
Кроме того, как и в 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)
Вы можете использовать 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 для запросов схемы.
Кроме того, создайте новый объект ManagementClass с именем в качестве пути, чтобы получить класс .
using System.Management; ... ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
Определение класса в VBScript можно получить аналогично получению определенного экземпляра.
Получение определения класса в VBScript
Вызовите SWbemServices.Get , но не идентифицируйте конкретный экземпляр в пути к объекту для класса .
В следующем примере кода извлекается определение класса для класса, описывающего логические диски на компьютере.
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
Узел сценариев Windows (WSH) также поддерживает следующее.
<OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
На страницах Active Server (ASP) используйте GetObject или CreateObject в скрипте на стороне сервера. Дополнительные сведения см. в статье Создание активных серверных страниц для WMI.
Можно также указать класс или экземпляр. В этом случае возвращаемый объект является объектом WMI, например экземпляром Win32_LogicalDisk, а не объектом служб. Обратите внимание, что нельзя использовать функции GetObject VBScript для создания экземпляра универсального объекта SWbemObject.
На HTML-страницах, запущенных в Microsoft Internet Обозреватель (IE), GetObject и CreateObject могут завершиться сбоем, так как объекты скриптов WMI, такие как элементы ActiveX, не помечены как безопасные для сценариев. Исключением является объект SWbemDateTime . Единственным способом успешного выполнения этих вызовов является понижение параметров безопасности IE, что не рекомендуется.
При получении класса в C++ вызовите версию GetObjectIWbemServices.
Получение определения класса в C++
- Вызовите методы IWbemServices::GetObject или IWbemServices::GetObjectAsync , чтобы получить определение класса.
- Один класс может иметь несколько определений классов, что обычно происходит при загрузке нескольких поставщиков классов в одно пространство имен. Если класс содержит несколько определений классов, WMI возвращает первое обнаруженное определение и код состояния WBEM_S_DUPLICATE_OBJECTS .
Так как GetObject возвращает определение класса, он обычно используется в качестве первого шага при создании экземпляра. Дополнительные сведения об использовании GetObject см. в статье Создание и объявление экземпляра с помощью C++.