Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Программирование для администраторов
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

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 связаны некоторые особенности, которые необходимо учитывать:

  • по умолчанию в коллекцию-результат запроса попадают все экземпляры указанного вами класса вместе с их подклассами. Если подклассы вам не нужны, то фильтр WHERE может выглядеть так:

SELECT * FROM CIM_MediaAccessDevice WHERE __CLASS = _ 'Win32_CDROMDrive'

Обратите внимание, что перед словом __CLASS стоит двойное подчеркивание.

  • в фильтре WHERE используются стандартные операторы SQL: =, <, >, <>, <=, >=. У операторов IS и IS NOT - специальное назначение: они используются только для сравнения значения свойства с NULL:

SELECT * FROM Win32_Fan WHERE Description IS Null

Есть еще специальный оператор ISA, который используется для проверки значений свойств вложенных классов. К сожалению, оператор LIKE в WQL не используется.

Запросы WQL очень удобно тестировать из CIM Studio из поставки WMI SDK.

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 

 
© 2004-2008, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru