Управление сетями Windows с помощью сценариев. Часть 12. Свойства класса WMI

Опубликовано: 23 Марта, 2023

  • Управление сетями 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