Управление сетями Windows с помощью сценариев. Часть 13. Удобный сценарий возврата всех значений
В предыдущей статье этой серии мы придумали сценарий DisplayClassProperties.vbs, который отображает имена всех свойств класса WMI. Вот как выглядит этот сценарий с использованием Win32_BootConfiguration в качестве класса, к которому мы подключаемся в нашем прозвище WMI:
Получите набор ресурсов для Windows Vista уже сегодня!
Когда я запускаю этот сценарий (используя учетные данные локального администратора!) на моей рабочей станции Windows XP (с Cscript.exe, предварительно настроенным в качестве хоста сценария Windows по умолчанию), я получаю следующий результат:
Я также упомянул в прошлой статье, что этот сценарий можно легко настроить для отображения имен свойств класса WMI. Например, предположим, что мы хотим отобразить все имена всех свойств в классе Win32_DiskPartition. Для этого все, что нам нужно сделать, это изменить строку:
к этому:
Теперь, когда мы снова запустим наш скрипт, мы получим следующий результат:
Отображение значений каждого свойства
Теперь в этот момент вы можете сказать: Ну и что? Все, что делает этот сценарий, — это отображает имя каждого свойства класса — а как насчет отображения каждого свойства?
Что ж, это хороший момент! Давайте посмотрим, сможем ли мы изменить сценарий (мы вернулись к использованию Win32_BootConfiguration в качестве нашего класса), чтобы сценарий отображал не только имена всех свойств, но и их значения. Сделайте это, давайте попробуем изменить эту строку:
к этому:
Вот что мы получим, когда запустим скрипт:
Хм, все значения нулевые, т.е. пустые. Почему?
Вот что происходит. Посмотрите на эту строку:
Подставляя значения каждой переменной, мы могли бы переписать эту строку следующим образом:
Обратите внимание, что мы подключаемся к определенному классу WMI (Win32_BootConfiguration) в строке нашего моникера WMI, чтобы мы могли вернуть коллекцию, содержащую все свойства этого класса. Затем мы хотим отобразить имя и значение каждого свойства. Но значения возвращаются как NULL, потому что мы не подключились к конкретному этого класса. В глоссарии WMI говорится, что экземпляр — это «представление реального управляемого объекта, принадлежащего к определенному классу», и что «экземпляры содержат фактические данные», а фактические данные — это то, что нам нужно, верно? Итак, как нам подключиться к экземпляру класса?
Чтобы подключиться к экземпляру класса, вам нужно указать конкретный экземпляр, используя класса. Снова обратившись к глоссарию WMI, мы видим, что свойство key — это «свойство, предоставляющее уникальный идентификатор для экземпляра класса» и что «ключевые свойства отмечены квалификатором Key» в документации MSDN. Давайте посмотрим на страницу MSDN для класса Win32_BootConfiguration, чтобы узнать, что является ключевым свойством для этого класса. На рис. 1 показана часть этой страницы, определяющая ключевое свойство для этого класса:
Рисунок 1: Свойство Key для класса Win32_BootConfiguring
На этой странице MSDN мы видим, что ключевым свойством для класса Win32_BootConfiguration является Name. Это означает, что нам нужно указать значение для этого свойства в строке нашего моникера WMI, если мы хотим подключиться к конкретному экземпляру этого класса, чтобы получить значения каждого свойства для класса. Другими словами, все, что нам нужно сделать, это изменить эту строку:
strWMIQuery = ":Win32_BootConfiguration"
к этому:
strWMIQuery = ":Win32_BootConfiguration.Name='ЧТО-ТО'"
где SOMETHING — это значение свойства Name конкретного экземпляра класса.
Итак, как мы можем узнать значение ключевого свойства конкретного экземпляра этого класса? Один из способов — использовать тестер инструментария управления Windows (wbemtest.exe). Начните с ввода wbemtest в командной строке. Откроется следующее окно:
Рисунок 2: Тестер инструментария управления Windows
Нажмите кнопку Connect и подключитесь к пространству имен rootcimv2:
Рисунок 3: Подключение к классу Win32_BootConfiguration
Нажмите «Подключиться», чтобы вернуться в главное окно, где все кнопки отображаются как доступные:
Рисунок 4: Подключен к классу
Теперь нажмите кнопку Enum Instances и введите имя класса, чтобы отобразить все экземпляры класса:
Рисунок 5: Отображение экземпляров класса
Наконец, нажмите OK, чтобы отобразить все экземпляры класса, перечисленные по их ключевому свойству (Имя):
Рисунок 6: Экземпляры Win32_BootConfiguration
Ну, после всего этого получается, что на нашей машине есть только один экземпляр этого класса и свойство Name этого экземпляра имеет значение «BootConfiguration»! Это означает, что для отображения значений всех свойств экземпляра класса Win32_BootConfiguration на нашей машине нам нужно всего лишь изменить эту строку:
strWMIQuery = ":Win32_BootConfiguration"
к этому:
strWMIQuery = ":Win32_BootConfiguration.Name='BootConfiguration'"
Другими словами, наш пересмотренный сценарий DisplayClassProperties.vbs теперь выглядит так:
Опция явная
При ошибке Возобновить Далее
Dim strКомпьютер
Dim strWMINamespace
Dim strWMIQuery
Дим objWMIService
тусклые элементы
Тусклый объект
стрКомпьютер = «.»
strWMINamespace = "
ootCIMV2"
strWMIQuery = ":Win32_BootConfiguration.Name='BootConfiguration'"
Установите objWMIService = GetObject("winmgmts:\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo «Количество свойств класса » & strWMIQuery & » равно » & objWMIService.Properties_.count
Для каждого объекта objItem в objWMIService.Properties_
Wscript.Echo «Свойство: » & objItem.name & vbTab & «Значение: » & objItem.value
Следующий
И теперь, когда мы запускаем этот скрипт, он отображает не только имена всех свойств, но и их значения:
C:scripts> DisplayClassProperties.vbs
Microsoft (R) Windows Script Host версии 5.6
Авторское право (C) Microsoft Corporation 1996-2001. Все права защищены.
Количество свойств класса:Win32_BootConfiguration.Name='BootConfiguration'
9
Свойство: BootDirectory Значение: WINDOWS
Свойство: Значение заголовка: DeviceHarddisk0Partition1
Свойство: ConfigurationPath Значение: WINDOWS
Свойство: Описание Значение: DeviceHarddisk0Partition1
Свойство: LastDrive Значение: C:
Свойство: Имя Значение: BootConfiguration
Свойство: ScratchDirectory Значение: C:WINDOWSsystem32configsystemprofileLocal SettingsTemp
Свойство: SettingID Значение:
Свойство: TempDirectory Значение: C:WINDOWSsystem32configsystemprofileLocal SettingsTemp
Если представить эту информацию в виде таблицы, ее будет легче читать:
BootDirectory | ОКНА |
Подпись | DeviceHarddisk0Partition1 |
Путь конфигурации | ОКНА |
Описание | DeviceHarddisk0Partition1 |
Ластдрайв | С: |
Имя | BootConfiguration |
ScratchDirectory | C:WINDOWSsystem32configsystemprofileLocal SettingsTemp |
Идентификатор настройки | Ценность: |
TempDirectory | C:WINDOWSsystem32configsystemprofileLocal SettingsTemp |
Вывод
Мы видим, что этот простой скрипт «возврат всех значений» дал нам некоторую полезную информацию о нашей машине! Теперь вот упражнение, которое вы можете попробовать самостоятельно: вместо подключения экземпляра класса Win32_BootConfiguration (существует только один экземпляр этого класса), попробуйте подключиться к экземпляру класса Win32_DiskPartition (который имеет несколько экземпляров, если на вашей машине более один раздел). Для этого сначала используйте wbemtest для отображения экземпляров этого класса (и для изучения ключевого свойства, которое отличает эти экземпляры), а затем измените сценарий DisplayClassProperties.vbs, чтобы он отображал свойства и значения указанного экземпляра этого класса (т.е. указанного раздела диска). Удачи!