Давным-давно в третьей статье из этого цикла, мы разработали следующий простой сценарий под названием displayTimeZone.vbs, который позволяет отобразить настройки для текущей временной зоны на вашем компьютере. Сценарий выглядел следующим образом:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = "SELECT * FROM Win32_TimeZone"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace)
Set colItems = objWMIService.ExecQuery(strWMIQuery)
For Each objItem In colItems
WScript.Echo objItem.Caption
Next
Когда я запускал этот сценарий, то получал следующий результат:
C:\scripts>DisplayTimeZone.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
(GMT-06:00) Central Time (US & Canada)
Откуда я узнал, что именно свойство Caption (заголовок) класса Win32_TimeZone class позволяет получить информацию, которую я хочу отобразить? Всю эту информацию мы получили, прочитав описание класса Win32_TimeZone WMI в MSDN. В действительности на этой странице MSDN сообщается, что свойство Description (описание) в действительности позволяет получить ту же самую информацию, что и свойство Caption (заголовок), поэтому я могу изменить строку WScript.Echo objItem.Caption на следующую строку WScript.Echo objItem.Description и получить тот же самый результат.
Что еще мы можем узнать на этой странице MSDN относительно класса Win32_TimeZone class? Что, если я хотел выяснить информацию, касающуюся того, когда будет осуществлен переход на летнее время на этом компьютере? Быстрый просмотр этой страницы приводит меня к такой информации, касающейся свойства DaylightMonth property:
DaylightMonth
Data type: uint32
Access type: Read-only
Месяц, когда происходит переход с зимнего на летнее время в операционной системе.
Value Meaning (Краткие обозначения)
1
0x1 January (январь)
2
0x2 February (февраль)
3
0x3 March (март)
4
0x4 April (апрель)
5
0x5 May (май)
6
0x6 June (июнь)
7
0x7 July (июль)
8
0x8 August (август)
9
0x9 September (сентябрь)
10
0xA October (октябрь)
11
0xB November (ноябрь)
12
0xC December (декабрь)
Чтобы использовать эту информацию, я просто изменю строку WScript.Echo objItem.Caption на строку WScript.Echo objItem.DaylightMonth , а ниже можно увидеть то, что мы получим после выполнения сценария:
C:\scripts>DisplayTimeZone.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
3
Достаточно справедливо, переход на летнее время в этом году был в марте, вместо апреля из-за изменений в законодательстве, принятых правительством (а также принятых затем здесь в Канаде).
Теперь мы можем продолжить наш процесс обучения, изменяя свойство <property> для объекта WScript.Echo objItem.<property> и так последовательно изучая одно за другим свойства класса Win32_TimeZone. А может быть есть способ проще? Можно ли увидеть все свойства этого класса с помощью одного сценария, не меняя их в сценарии? Конечно! Но перед тем, как мы сделаем это, давайте сперва попытаемся получить список свойств этого класса. Ниже можно увидеть, как это сделать:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = ":Win32_TimeZone"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count
Ниже можно увидеть результат выполнения этого нового сценария, который мы назовем DisplayClassProperties.vbs:
C:\scripts>DisplayClassProperties.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
Number of properties of :Win32_TimeZone class is 24
Обратившись к странице свойств класса Win32_TimeZone в MSDN, мы можем убедиться, что это верно, т.е. класс Win32_TimeZone имеет 24 свойства.
Как работает этот новый класс? Во-первых, обратите внимание, что вместо подключения к пространству имен по умолчанию (default namespace «\root\CIMV2») на локальном компьютере («.»), мы подключаемся напрямую к классу Win32_TimeZone class на компьютере. Другими словами, строку:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
можно заменить на строку:
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_TimeZone")
и она сделает те же самые действия. Во-вторых, вы должны обратить внимание, на забавную вещь в последней строке сценария:
objWMIService.Properties_.count
Это странно, не так ли? Мы знаем, о свойствах properties (т.е. <object>.<property>) и методах methods (т.е. <object>.<method>) из первой статьи из этого цикла, но objWMIService.Properties_.count имеет две точки, а не одну. Что же здесь происходит? Давайте снова вернемся к этой строке:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
которая, как мы видели эквивалентна этой строке:
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_TimeZone")
Моникер (moniker) в этом предложении WMI winmgmts:\\.\root\CIMV2:Win32_TimeZone и он описывает путь к классу WMI, к которому мы хотим получить доступ, и есил мы используем функцию GetObject для этого моникера (moniker), то она возвращает обхект SwbemObject, который затем присваивается переменной objWMIService с помощью команды Set. (Более точно, функция GetObject возвращает ссылку на объект SwbemObject, предоставляемый компонентом COM)
Итак, другими словами, если выполняется предложение:
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_TimeZone")
То мы получаем объект SWmebObject. Теперь у объекта есть свойства, а какие свойства может иметь объект SWmebObject? Одно из свойств, которое он может иметь, называется Properties_ и использует стандартную условную запись <object><properties>, что значит, что свойство Properties_ объекта SWebmObject можно вызвать таким образом SWbemObject.Properties_ (подчеркивание является часть названия свойства). Более подробно о свойстве SWbemObject.Properties_ объекта SWebmObject вы можете узнать на этой странице MSDN, а на ней говорится, что это свойство представляет собой набор всех свойств класса, или, другими словами, свойство SWbemObject.Properties_ представляет собой массив или коллекцию. А как вы помните, коллекция – это объект такого типа, который содержит несколько элементов (которые могут быть либо объектами либо свойствами, но не методами).
Другими словами, SWbemObject.Properties_ в действительности коллекция (тип объекта), а так как у объектов есть свойства, то у этого объекта также есть свойства. И одно из свойств этого класса называется .count, которое возвращает количество свойств объекта, т.е. <collection>.<count> возвращает количество элементов в этой коллекции. Поэтому SWbemObject.Properties_.count – это свойство .count объекта SWbemObject.Properties_, отсюда и получаются две точки, вместо привычно одной точки в синтаксисе <object>.<property>.
По крайней мере, так я понимаю эту вещь, но, пожалуйста, помните, что я не разработчик—я лишь разбираюсь в том, как работает сценарий!
Итак, теперь, когда мы может получить список (количество) свойств класса Win32_TimeZone, как мы можем получить названия самих свойств? Путем добавления следующих строк в конце нашего сценария DisplayClassProperties.vbs:
For Each objItem in objWMIService.Properties_
Wscript.Echo "Property: " & objItem.name
Next
Ниже можно увидеть результат выполнения нашего сценария:
C:\scripts>DisplayClassProperties.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
Number of properties of :Win32_TimeZone class is 24
Property: Bias
Property: Caption
Property: DaylightBias
Property: DaylightDay
Property: DaylightDayOfWeek
Property: DaylightHour
Property: DaylightMillisecond
Property: DaylightMinute
Property: DaylightMonth
Property: DaylightName
Property: DaylightSecond
Property: DaylightYear
Property: Description
Property: SettingID
Property: StandardBias
Property: StandardDay
Property: StandardDayOfWeek
Property: StandardHour
Property: StandardMillisecond
Property: StandardMinute
Property: StandardMonth
Property: StandardName
Property: StandardSecond
Property: StandardYear
Проверив нашу страницу в MSDN, описывающую класс Win32_TimeZone class, мы можем увидеть, что все свойства этого класса благополучно отобразились.
Сила такого подхода заключается в том, что он позволяет нам получить список свойств любого класса WMI, чтобы можно было бы его лучше изучить. (Помните, что в третьей статье из этого цикла мы видели, как увидеть список всех классов WMI в пространстве имен, а вооружившись таким списком, мы можем дальше увидеть, чем мы можем управлять с помощью WMI.)
Например, предположим, что мы хотим получить список свойств класса Win32_BootConfiguration WMI class. Чтобы сделать это с помощью нашего сценария DisplayClassProperties.vbs script, все, что нам необходимо, это изменить строку:
strWMIQuery = ":Win32_TimeZone"
на следующую:
strWMIQuery = ":Win32_BootConfiguration"
После этого изменения, мы заново запускаем наш сценарий и получаем следующий результат:
C:\scripts>DisplayClassProperties.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
Number of properties of :Win32_BootConfiguration class is 9
Property: BootDirectory
Property: Caption
Property: ConfigurationPath
Property: Description
Property: LastDrive
Property: Name Value:
Property: ScratchDirectory
Property: SettingID
Property: TempDirectory
Я советую вам использовать эту статью совместно с третьей статьей из этого цикла для изучения классов WMI и их свойств в своем дальнейшем обучении, а об остальных возможностях при использовании WMI для управления компьютерами Windows мы узнаем в следующих статьях из этого цикла.
www.windowsnetworking.com
Tags: mpd