|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
16.6 Как добраться до конкретного объекта: язык запросов WQLЗапросы WQL (WMI Query Language) в скриптах WMI на VBScript, методы InstancesOf() и ExecQuery(), синтаксис запросов WQL, отладка запросов WQL Основная функциональность WMI заключена в свойствах и методах объектов этой библиотеки. Как работать со свойствами и методами этих объектов, мы уже поговорили, теперь - про то, как можно найти нужный объект. Самый простой вариант - получить коллекцию всех объектов определенного класса. Для этой цели можно использовать метод InstancesOf объекта SWbemServices. Этот метод всегда возвращает коллекцию, даже если она состоит только из одного объекта. Для того, чтобы получить доступ к элементам этой коллекции, проще всего использовать давно знакомую нам конструкцию For ... Each: Dim oLocator Set oLocator = CreateObject("wbemScripting.Swbemlocator") Dim oSvc Set oSvc = oLocator.ConnectServer() Dim oCol Set oCol = oSvc.InstancesOf("win32_product") For Each item In oCol WScript.Echo item.Name Next Отфильтровать нужный объект можно, например, так: Dim oCol Dim oProductOffice Set oCol = oSvc.InstancesOf("win32_product") For Each item In oCol If (InStr(item.name, "Microsoft Office") <> 0) Then Set oProductOffice = Item End If Next MsgBox oProductOffice.Name Однако, конечно, с точки зрения производительности такой подход трудно признать самым правильным. Нам приходится помещать ссылки на все установленные продукты в коллекцию и перебирать ее, чтобы найти нужный. Намного удобнее воспользоваться встроенным в WMI языком запросов - WQL (WMI Query Language, другое название - SQL for WMI). Этот язык позиционируется как ANSI SQL-совместимый, хотя ограничений у него очень много (например, при помощи него нельзя изменять данные - операторов INSERT, UPDATE, DELETE в нем не предусмотрено). В WQL предусмотрено три типа запросов: 1) запросы к данным - они будут рассмотрены ниже 2) запросы к событиям - они будут рассмотрены в следующем разделе 3) запросы к структуре WMI - они позволяют информацию о структуре классов WMI. В практической работе используются нечасто и поэтому рассматриваться здесь не будут. Общий синтаксис запроса WQL выглядит так: SELECT свойства FROM имя_класса WHERE свойство оператор значение Если использовать запрос WQL в нашем примере для получения информации об установленных продуктах, то в самом простом варианте он может выглядеть так: Dim oCol Set oCol = oSvc.ExecQuery("select * from Win32_Product") For Each item In oCol WScript.Echo item.Name Next Если мы, как в обычном SQL, укажем только нужные нам столбцы, вернется та же коллекция уже знакомых нам объектов SWbemObject, но только с указанными нами свойствами плюс свойство, которое определено как ключевое. В примере ниже вернется явно указанное нами свойство Version и ключевое свойство Name. Если попробуем обратиться еще и к свойству InstallState, возникнет ошибка: Dim oCol Set oCol = oSvc.ExecQuery("select version from Win32_Product") For Each item In oCol Wscript.Echo item.Version WScript.Echo item.Name WScript.Echo TypeName(item) Next Выражение FROM в WQL-запросе - это, конечно, имя класса, коллекцию экземпляров которого мы хотим получить. О доступных в WMI классах будет рассказано ниже. Выражение WHERE определяет фильтр в запросе - таким образом мы оставляем в коллекции только те объекты, которые нам нужны: Dim oCol Set oCol = oSvc.ExecQuery("select * from Win32_Product WHERE description = _ ' Microsoft Office - профессиональный выпуск версии 2003'") For Each item In oCol WScript.Echo item.Name Next С применением фильтра WHERE связаны некоторые особенности, которые необходимо учитывать:
SELECT * FROM CIM_MediaAccessDevice WHERE __CLASS = _ 'Win32_CDROMDrive' Обратите внимание, что перед словом __CLASS стоит двойное подчеркивание.
SELECT * FROM Win32_Fan WHERE Description IS Null Есть еще специальный оператор ISA, который используется для проверки значений свойств вложенных классов. К сожалению, оператор LIKE в WQL не используется. Запросы WQL очень удобно тестировать из CIM Studio из поставки WMI SDK.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||