В предыдущей статье из этого цикла мы разработали сценарий под названием DisplayClassProperties.vbs, который позволяет отобразить названия всех свойств класса WMI class. Ниже показан, как выглядит этот сценарий, с помощью класса Win32_BootConfiguration мы подключились к нашему моникеру WMI moniker:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = ":Win32_BootConfiguration"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count
For Each objItem in objWMIService.Properties_
Wscript.Echo "Property: " & objItem.name
Next
Когда я запустил этот сценарий (используя для этого права локального администратора!) на моей рабочей станции, которая работает под управлением операционной системы Windows XP (при этом в качестве механизма для сценариев по умолчанию Windows script host выбран Cscript.exe) я получил следующий результат:
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
Property: ScratchDirectory
Property: SettingID
Property: TempDirectory
В последней статье я также упоминал, что этот сценарий можно легко изменить таким образом, чтобы он отображал названия свойств любого другого класса WMI. Например, предположим, что мы хотим отобразить названия всех свойств для класса Win32_DiskPartition class. Для этого нам нужно лишь изменить одну строку в сценарии:
strWMIQuery = ":Win32_BootConfiguration"
на такую:
strWMIQuery = ":Win32_DiskPartition"
Теперь, когда мы вновь запустим этот сценарий, то получим следующий результат:
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_DiskPartition class is 34
Property: Access
Property: Availability
Property: BlockSize
Property: Bootable
Property: BootPartition
Property: Caption
Property: ConfigManagerErrorCode
Property: ConfigManagerUserConfig
Property: CreationClassName
Property: Description
Property: DeviceID
Property: DiskIndex
Property: ErrorCleared
Property: ErrorDescription
Property: ErrorMethodology
Property: HiddenSectors
Property: Index
Property: InstallDate
Property: LastErrorCode
Property: Name
Property: NumberOfBlocks
Property: PNPDeviceID
Property: PowerManagementCapabilities
Property: PowerManagementSupported
Property: PrimaryPartition
Property: Purpose
Property: RewritePartition
Property: Size
Property: StartingOffset
Property: Status
Property: StatusInfo
Property: SystemCreationClassName
Property: SystemName
Property: Type
Теперь у вас может возникнуть другой вопрос. Все, что умеет делать этот сценарий, лишь отображать название каждого свойства класса, а как насчет того, чтобы отображать значение каждого свойства?
Не плохая идея! Давайте посмотрим, можем ли мы изменить сценарий (мы снова вернемся к нашему классу Win32_BootConfiguration) таким образом, чтобы он позволял отобразить не только названия всех свойств, но и также из значения. Чтобы сделать это, давайте попробуем изменить эту строку:
Wscript.Echo "Property: " & objItem.name
На такую:
Wscript.Echo "Property: " & objItem.name & vbTab & "Value: " & objItem.value
Ниже мы можем увидеть, что у нас получилось после запуска сценария:
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 Value:
Property: Caption Value:
Property: ConfigurationPath Value:
Property: Description Value:
Property: LastDrive Value:
Property: Name Value:
Property: ScratchDirectory Value:
Property: SettingID Value:
Property: TempDirectory Value:
Хмм, все значения нулевые, т.е. пустые. Почему?
Итак, что же здесь происходит. Посмотрим на эту строку:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
Подставляя значения для каждой переменной, мы можем переписать эту строку следующим образом:
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2:Win32_BootConfiguration")
Обратите внимание, что мы подключаемся к определенному классу WMI (Win32_BootConfiguration) в нашей строке моникера WMI moniker, поэтому мы можем получить коллекцию, содержащую все свойства этого класса. Затем мы хотим отобразить название и значение каждого свойства. Но значения возвращаются нулевыми (NULL), потому что мы не подключились к определенной ссылке (instance) на этот класс. В словаре WMI Glossary говорится, что ссылка – это представление реального управляемого объекта, который принадлежит к определенному классу, и что ссылки содержат реальные данные, а реальные данные – это именно то, что нам нужно, верно? Итак, как мы можем подключиться к ссылке на класс?
Чтобы подключиться к ссылке на класс, вы должны указать конкретную ссылку, используя ключевое свойство (key property) класса. Снова обратившись к словарю WMI Glossary, мы находим, что ключевое свойство – это свойство, которое позволяет получить уникальный идентификатор (unique identifier) для ссылки на класс, а также, что ключевые свойства помечаются ключевыми классификаторами, из документации MSDN. Давайте посмотрим на страницу MSDN, на которой приводится описание класса Win32_BootConfiguration class, чтобы узнать, что является ключевым свойством этого класса. На рисунке 1 изображена часть этой страницы, на которой рассказывается о ключевом свойстве для этого класса:
Рисунок 1: Ключевое свойство для класса Win32_BootConfiguring class
Из этой страницы MSDN мы можем узнать, что ключевым свойством для класса Win32_BootConfiguration является свойство Name. Это значит, что мы должны указать значение для этого свойства в нашей строке моникера WMI moniker, если мы хотим подключиться к конкретной ссылке на этот класс, чтобы получить значение каждого свойства этого класса. Другими словами, мы должны изменить эту строку сценария:
strWMIQuery = ":Win32_BootConfiguration"
на такую:
strWMIQuery = ":Win32_BootConfiguration.Name='SOMETHING'"
где ‘SOMETHING’ – это значение свойства Name для конкретной ссылки на класс.
Так, как же мы можем выяснить значение ключевого свойства для определенной ссылки на этот класс? Один из способов для этого заключается в использовании программы Windows Management Instrumentation Tester (wbemtest.exe). Запустите ее, набрав в командной строке wbemtest. В результате этого появится следующее окно:
Рисунок 2: Тестер инструментария Windows Management Instrumentation Tester
Нажмите на кнопку Connect (подключиться) и подключитесь к пространству имен root\cimv2 namespace:
Рисунок 3: Подключение к классу Win32_BootConfiguration
Нажмите на кнопку Connect (подключиться) чтобы вернуться к основному окну, в котором теперь доступны для использования все кнопку:
Рисунок 4: Подключившись к классу
Теперь нажмите на кнопку Enum Instances и наберите название класса, чтобы вы смогли отобразить все ссылки на класс:
Рисунок 5: Отображение ссылок на класс
Наконец нажмите на кнопку OK, чтобы увидеть все ссылки на класс, отсортированные ко ключевому свойству (Name):
Рисунок 6: Ссылки на класс Win32_BootConfiguration
Итак, после всего этого мы узнаем, что существует лишь одна ссылка на этот класс на нашем компьютере, и свойство Name этой ссылки имеет значение «BootConfiguration»! Это значит, что для того, чтобы отобразить значения всех свойств класса Win32_BootConfiguration на нашем компьютере, мы должны изменить эту строчку сценария:
strWMIQuery = ":Win32_BootConfiguration"
на такую строку:
strWMIQuery = ":Win32_BootConfiguration.Name='BootConfiguration'"
Другими словами, наш измененный сценарий DisplayClassProperties.vbs будет теперь выглядеть следующим образом:
Option Explicit
On Error Resume Next
Dim strComputer
Dim strWMINamespace
Dim strWMIQuery
Dim objWMIService
Dim colItems
Dim objItem
strComputer = "."
strWMINamespace = "\root\CIMV2"
strWMIQuery = ":Win32_BootConfiguration.Name='BootConfiguration'"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & strWMINamespace & strWMIQuery)
WScript.Echo "Number of properties of " & strWMIQuery & " class is " & objWMIService.Properties_.count
For Each objItem in objWMIService.Properties_
Wscript.Echo "Property: " & objItem.name & vbTab & "Value: " & objItem.value
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_BootConfiguration.Name='BootConfiguration' class
is 9
Property: BootDirectory Value: \WINDOWS
Property: Caption Value: \Device\Harddisk0\Partition1
Property: ConfigurationPath Value: \WINDOWS
Property: Description Value: \Device\Harddisk0\Partition1
Property: LastDrive Value: C:
Property: Name Value: BootConfiguration
Property: ScratchDirectory Value: C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp
Property: SettingID Value:
Property: TempDirectory Value: C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp
Занесем эту информацию в таблицу, чтобы легче ее прочитать:
BootDirectory | \WINDOWS |
Caption | \Device\Harddisk0\Partition1 |
ConfigurationPath | \WINDOWS |
Description | \Device\Harddisk0\Partition1 |
LastDrive | C: |
Name | BootConfiguration |
ScratchDirectory | C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp |
SettingID | Value: |
TempDirectory | C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp |
Мы можем видеть, что этот простой сценарий для получения всех значений позволил получить нам очень полезную информацию о компьютере! Теперь вы можете самостоятельно попробовать выполнить упражнение: вместо того, чтобы подключиться к ссылке на класс Win32_BootConfiguration class (существует лишь одна ссылка на этот класс), попытайтесь подключиться к классу Win32_DiskPartition (у которого есть несколько ссылок, если на вашей машине больше одного раздела). Для этого сначала используйте программу wbemtest для получения ссылок на этот класс (и чтобы узнать, как отличаются ключевые свойства для этих ссылок), а затем изменит сценарий DisplayClassProperties.vbs, чтобы он отображал свойства и значения определенной ссылки на этот класс (т.е. на указанный вами раздел диска). Удачи!
www.windowsnetworking.com
Tags: mpd, Windows XP