Управление сетями Windows с помощью сценариев. Часть 12. Свойства класса WMI
- Управление сетями Windows с помощью сценариев. Часть 14. Дополнительные сведения о сценариях WMI
Еще в третьей статье этой серии мы разработали следующий простой скрипт с именем displayTimeZone.vbs, который отображает текущую настройку часового пояса на вашем компьютере:
Опция явная
При ошибке Возобновить Далее
Dim strКомпьютер
Dim strWMINamespace
Dim strWMIQuery
Дим objWMIService
тусклые элементы
Тусклый объект
стрКомпьютер = «.»
strWMINamespace = "
ootCIMV2"
strWMIQuery = «ВЫБЕРИТЕ * ИЗ Win32_TimeZone»
Установите objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace)
Установить colItems = objWMIService.ExecQuery(strWMIQuery)
Для каждого объекта в colItems
WScript.Echo objItem.Caption
Следующий
Когда я запускаю этот скрипт, я получаю следующий результат:
C:scripts> DisplayTimeZone.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.
(GMT-06:00) Центральное время (США и Канада)
Как я узнал, что именно свойство Caption класса Win32_TimeZone содержит информацию, которую я хочу отобразить? Прочитав описание WMI-класса Win32_TimeZone в MSDN. Фактически, эта страница MSDN говорит нам, что свойство Description в основном возвращает ту же информацию, что и свойство Caption, поэтому я мог бы изменить строку WScript.Echo objItem.Caption на WScript.Echo objItem.Description и получить тот же результат.
Получите набор ресурсов для Windows Vista уже сегодня!
Что еще эта страница MSDN говорит нам о классе Win32_TimeZone? Ну, а если бы я захотел узнать, в каком месяце на нашей машине вступает в силу летнее время? Быстрое чтение страницы приводит меня к следующей информации о свойстве DaylightMonth:
Дневной светМесяц
Тип данных: uint32
Тип доступа: только для чтения
Месяц, когда в операционной системе происходит переход со стандартного времени на летнее время.
Значение Значение
1
0x1 января
2
0x2 февраля
3
0x3 марта
4
0x4 апреля
5
0x5 мая
6
0x6 июня
7
0x7 июля
8
0x8 августа
9
0x9 сентября
10
0xA Октябрь
11
0xB ноябрь
12
0xC декабрь
Чтобы использовать эту информацию, я просто меняю строку WScript.Echo objItem.Caption на WScript.Echo objItem.DaylightMonth, и вот что я получаю, когда запускаю свой скрипт:
C:scripts> DisplayTimeZone.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.
3
Разумеется, переход на летнее время начался в марте этого года, а не в апреле, из-за изменений, принятых правительством США (и скопированных здесь, в Канаде).
Перечисление свойств класса
Теперь мы могли бы продолжить наш процесс обучения, изменив <property> в WScript.Echo objItem.<property> и таким образом постепенно отображая каждое из свойств класса Win32_TimeZone одно за другим, но может ли быть более простой способ? Можно ли отобразить все свойства этого класса в одном скрипте, не называя их в самом скрипте? Конечно! Но прежде чем мы это сделаем, давайте сначала попробуем перечислить количество свойств этого класса. Вот как мы это делаем:
Опция явная
При ошибке Возобновить Далее
Dim strКомпьютер
Dim strWMINamespace
Dim strWMIQuery
Дим objWMIService
тусклые элементы
Тусклый объект
стрКомпьютер = «.»
strWMINamespace = "
ootCIMV2"
strWMIQuery = ":Win32_TimeZone"
Установите objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo «Количество свойств класса » & strWMIQuery & » равно » & objWMIService.Properties_.count
Вот результат запуска этого нового скрипта, который мы назовем DisplayClassProperties.vbs:
C:scripts> DisplayClassProperties.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.
Количество свойств класса:Win32_TimeZone равно 24.
Быстрый подсчет свойств на странице MSDN Win32_TimeZone говорит нам, что это правильно, т. е. класс Win32_TimeZone имеет всего 24 свойства.
Как работает этот новый скрипт? Во-первых, вы заметите, что вместо подключения к пространству имен по умолчанию (« ootCIMV2») на локальном компьютере («.») мы подключаемся непосредственно к классу Win32_TimeZone на компьютере. Другими словами, строка:
Установите objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery)
можно заменить на:
Установите objWMIService = GetObject("winmgmts:\. ootCIMV2:Win32_TimeZone")
и он сделал бы то же самое. Еще одна вещь, которую вы заметите, это забавная вещь в последней строке скрипта:
objWMIService.Properties_.count
Это странно, не так ли? Мы знаем о свойствах (например, <object>.<property>) и методах (например, <object>.<method>) из первой статьи этой серии, но в objWMIService.Properties_.count две точки, а не одна. Что тут происходит? Что ж, вернемся к этой строке снова:
Установите objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery)
который мы видели, эквивалентен этому:
Установите objWMIService = GetObject("winmgmts:\. ootCIMV2:Win32_TimeZone")
Моникер в этом операторе WMI — winmgmts:\. ootCIMV2:Win32_TimeZone, и он определяет путь к классу WMI, к которому мы хотим получить доступ, и когда вы используете функцию GetObject для этого псевдонима, он возвращает Объект SWbemObject, который затем присваивается переменной objWMIService с помощью оператора Set. (Точнее, функция GetObject возвращает ссылку на объект SWbemObject, предоставленный COM-компонентом, но кому это нужно, если вы не пытаетесь произвести на кого-то впечатление.)
Другими словами, когда утверждение:
Установите objWMIService = GetObject("winmgmts:\. ootCIMV2:Win32_TimeZone")
выполняется, мы получаем возвращенный нам объект SWmebObject. Теперь у объектов есть свойства, так какие свойства может иметь объект SWmebObject? Что ж, одно свойство, которое он может иметь, называется Properties_, и с использованием стандартной нотации <object><properties> это означает, что свойство Properties_ объекта SWebmObject будет обозначаться как SWbemObject.Properties_ (да, символ подчеркивания является частью имени свойства). Вы можете прочитать больше о свойстве SWbemObject.Properties_ объекта SWebmObject на этой странице в MSDN, и это говорит нам о том, что это свойство является «набором свойств для текущего класса или экземпляра» или, другими словами, SWbemObject.Properties_ имущество представляет собой коллекцию. И помните, что коллекция — это тип объекта, который содержит несколько элементов (которые могут быть либо другими объектами, либо свойствами, но не методами).
Другими словами, SWbemObject.Properties_ на самом деле является коллекцией (типом объекта), и поскольку объекты могут иметь свойства, то и этот объект тоже. И одно свойство, которое может иметь коллекция, это.count, которое возвращает количество свойств объекта, т.е. <коллекция>.<count> возвращает количество элементов в коллекции. Таким образом, это означает, что SWbemObject.Properties_.count является свойством.count объекта SWbemObject.Properties_, поэтому в синтаксисе <object>.<property> используются две точки вместо обычной одиночной.
По крайней мере, так я это понимаю, но, пожалуйста, помните, что я не разработчик — я просто гик, как и вы, который учится писать сценарии, чтобы выполнять свою работу!
Отображение свойств класса
Итак, теперь, когда мы можем перечислить (возвратить количество) свойств класса Win32_TimeZone, как нам вернуть имена самих фактических свойств? Добавив следующие строки в конец нашего скрипта DisplayClassProperties.vbs:
Для каждого объекта objItem в objWMIService.Properties_
Wscript.Echo «Свойство:» и objItem.name
Следующий
Вот что мы получаем, когда запускаем наш скрипт:
C:scripts> DisplayClassProperties.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.
Количество свойств класса:Win32_TimeZone равно 24.
Свойство: предвзятость
Свойство: Заголовок
Свойство: DaylightBias
Свойство: DaylightDay
Свойство: DaylightDayOfWeek
Свойство: DaylightHour
Свойство: DaylightMillisecond
Свойство: DaylightMinute
Свойство: DaylightMonth
Свойство: DaylightName
Свойство: DaylightSecond
Свойство: DaylightYear
Описание недвижимости
Свойство: ID настройки
Свойство: StandardBias
Недвижимость: StandardDay
Свойство: StandardDayOfWeek
Недвижимость: StandardHour
Свойство: StandardMillisecond
Свойство: StandardMinute
Свойство: StandardMonth
Свойство: StandardName
Свойство: StandardSecond
Недвижимость: StandardYear
Просматривая нашу предыдущую страницу MSDN, описывающую класс Win32_TimeZone, мы видим из приведенного выше, что имена всех свойств класса были успешно отображены.
Вывод
Сила этого подхода в том, что он позволяет перечислить имена свойств любого класса WMI, чтобы мы могли узнать о нем больше. (Помните, в третьей статье этой серии мы видели, как перечислить все классы WMI пространства имен, и, вооружившись этим списком, мы можем исследовать и посмотреть, чем мы можем управлять с помощью WMI.)
Например, предположим, что нам нужно вывести список свойств WMI-класса Win32_BootConfiguration. Чтобы сделать это с помощью нашего скрипта DisplayClassProperties.vbs, все, что нам нужно сделать, это изменить строку:
strWMIQuery = ":Win32_TimeZone"
читать следующим образом:
strWMIQuery = ":Win32_BootConfiguration"
Когда мы вносим это изменение и повторно запускаем наш скрипт, мы получаем такой результат:
C:scripts> DisplayClassProperties.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.
Количество свойств класса:Win32_BootConfiguration равно 9.
Свойство: BootDirectory
Свойство: Заголовок
Свойство: Путь конфигурации
Описание недвижимости
Недвижимость: LastDrive
Свойство: Имя Значение:
Свойство: ScratchDirectory
Свойство: ID настройки
Свойство: TempDirectory
Я рекомендую вам использовать эту статью вместе с третьей в этой серии, чтобы самостоятельно изучить классы WMI и их свойства, и мы узнаем больше о возможностях использования WMI для управления компьютерами Windows в следующих статьях этой серии..
- Управление сетями Windows с помощью сценариев. Часть 13. Удобный сценарий возврата всех значений
- Управление сетями Windows с помощью сценариев. Часть 14. Дополнительные сведения о сценариях WMI