|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
9.4.5. Язык WQL: подключение к объектам WMIОбъект SwbemServices, метод ExecQuery, WQL (Windows Query Language), автодокументирование объектов WMI, свойства Properties_ и Methods_ После того, как вы подключились с службе WMI на нужном компьютере, вам возвращается ссылка на объект SwbemServices. В этом несложно убедиться при помощи следующего кода: Dim oLocator Set oLocator = CreateObject("wbemScripting.Swbemlocator") Dim oServices Set oServices = oLocator.ConnectServer("LONDON", _ "root\Microsoft\SqlServer\ComputerManagement") MsgBox TypeName(oServices) Объект SwbemServices — основная "рабочая лошадка" в объектной модели WMI. Для него предусмотрено множество методов. Однако чаще всего вам нужно выполнить одну задачу — подключиться к конкретному объекту WMI, который, например, представляет службу SQL Server. Это можно сделать разными способами, но самый простой и логичный из них — использовать запрос на языке WQL. В самом простом варианте применение запроса на языке WQL может выглядеть так: Dim oCollection Set oCollection = oServices.ExecQuery("SELECT * FROM SQLService") For Each item In oCollection MsgBox item.ServiceName Next Язык WQL основан на языке SQL и позиционируется Microsoft как ANSI-совместимый, хотя, конечно, отличий от обычного SQL в нем очень много. Например, с его помощью нельзя изменять данные — операторов INSERT, UPDATE и DELETE в нем нет. В WQL можно выполнять три типа запросов: q запросы к данным (они будут рассмотрены далее в этом разделе); q запросы к событиям (они будут рассмотрены в разд. 9.4.6); q запросы к структуре WMI — позволяют получать информацию о структуре классов WMI. В практической работе они используются редко, поэтому рассматриваться здесь не будут. Общий вариант синтаксиса запроса WQL выглядит так: SELECT свойства FROM имя_класса WHERE свойство оператор значение Например: SELECT ServiceName, DisplayName FROM SQLService WHERE SQLServiceType='1' В этом примере ServiceName и DisplayName — это имена свойств, значения которых должны вернуться, SQLService — объект WMI, к которому производится запрос, а WHERE SQLServiceType='1' — это, конечно, фильтр, который позволяет фильтровать возвращаемые объекты. В данном случае будут возвращены только объекты для службы SQL Server (без служб SQL Server Agent, полнотекстового поиска и т. п.). Как вы видите, все очень похоже на обычный язык SQL. Классы WMI представляют собой аналоги таблиц, экземпляры этих классов — записи в таблицах, свойства — столбцы в таблице. В результате выполнения этого запроса вам вернется коллекция SwbemObjectSet с объектами SwbemObject. В самой коллекции ничего интересного нет, интересны только свойство Count (количество элементов в коллекции) и метод Item() (который позволяет вернуть нужный элемент). А вот про объекты SwbemObject, которые представляют собой конкретные экземпляры объектов WMI, необходимо рассказать подробнее. Сразу скажем, что SwbemObject — это не сам конечный объект WMI (т. е. не служба SQL Server в данном примере), а всего лишь оболочка, в которую "одет" этот объект. Например, у объекта SwbemObject для службы SQL Server (представленного конечным объектом SQLService) нет свойств ServiceName, DisplayName и SQLServiceType. Но к этим свойствам вполне можно обращаться, как в нашем примере! Этот момент часто запутывает разработчиков: из кода можно вызывать свойства, которые для этого объекта в подсказке редактора кода не видны. Это связано с тем, что обращения ко всем свойствам и методам, которые не определены для объекта SwbemObect, автоматически переадресовываются к объекту нижнего уровня. Поэтому, например, такой код будет вполне допустим: Dim oLocator Set oLocator = CreateObject("wbemScripting.Swbemlocator")
Dim oServices Set oServices = oLocator.ConnectServer("LONDON", _ "root\Microsoft\SqlServer\ComputerManagement")
Dim oCollection Set oCollection = oServices.ExecQuery("SELECT ServiceName, _ DisplayName FROM SQLService WHERE SQLServiceType='1'")
Dim oSWbemObject For Each oSWbemObject In oCollection MsgBox oSWbemObject.DisplayName Next Отметим еще один важный момент, связанный с объектом SwbemObject. При помощи свойства Properties_ этого объекта можно получить информацию о всех свойствах объекта нижнего уровня, а при помощи свойства Methods_ — о всех его методах. Чтобы случайно не перепутать свойства SwbemObject и объекта нижнего уровня, названия всех свойств и методов SwbemObject заканчиваются символом подчеркивание. Система WMI изначально построена так, чтобы быть в определенной степени самодокументируемой, например, чтобы информацию о всех свойствах и методах объектах WMI можно было получать не при помощи просмотрщика объектов, а просто из кода скрипта. Например, чтобы получить информацию о всех свойствах объекта WMI, представляющего службу SQL Server, можно использовать код вида: For Each item In oSWbemObject.Properties_ WScript.Echo item.Name & vbTab & item.Value Next а для получения информации о методах — такую же конструкцию: For Each item In oSWbemObject.Methods_ WScript.Echo item.Name Next В первом случае свойство Properties_ возвращает нам стандартную коллекцию SwbemPropertySet с обычными свойствами и методами типа Add(), Remove(), Item(), Count, которая состоит из объектов SwbemProperty. Самые важные свойства SwbemProperty такие: q Value — значение свойства. Это свойство используется по умолчанию; q Name — имя данного свойства; q IsArray — работает это свойство с массивом значений или нет; q Qualifiers — это свойство позволяет спуститься на уровень ниже и получить ссылку на коллекцию SwbemQualifierSet (коллекцию допустимых значений для этого свойства), если для него такой набор предусмотрен. Для методов все устроено точно так же: свойство Methods_ возвращает коллекцию SwbemMethodSet, состоящую из объектов SwbemMethod.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||