Можно ли себе представить, что для создания утилиты системного администрирования достаточно написать единственную строку кода? Тем не менее, именно это и позволяют сделать сценарии WMI (Windows Management Instrumentation). Листинг 1, представленный ниже, содержит строку кода для отображения состояния службы Windows Alerter. И хотя в листинге приведены две строки, в соответствии с правилами синтаксиса VBScript они интерпретируются именно как одна (нам пришлось разбить строку на две из-за требований к верстке издания). Сценарий (снова единственная строка!), представленный фрагментом В, позволяет запускать и останавливать службу Alerter.

Для выполнения запросов, подключения и управления системой однострочные сценарии используют механизм моникеров WMI. При обращении к моникерам WMI необходимо указать один обязательный компонент - префикс "winmgmts:" - и два необязательных. Обратите внимание, что двоеточие и двойные кавычки являются составляющей частью имени. Первый из необязательных компонентов представляет собой настройки безопасности, которые могут содержать настройки уровня авторизации, уровень аутентификации, метод аутентификации, разрешения авторизации и привилегии безопасности. Вторым необязательным компонентом является полное имя объекта (включая путь) - это может быть путь на удаленном компьютере, пространство имен WMI или класс Win32.

Хотя путь объекта представляет собой необязательный компонент вызова моникера WMI, он является обязательным для рассматриваемого класса однострочных сценариев. Как показано на рисунке 1, однострочный сценарий состоит из четырех частей. Первая часть управляет выводом на экран результатов работы сценария. Вторая часть - путь объекта-класса WMI, а третья часть - уникальный идентификатор экземпляра класса. Последним идет метод или свойство объекта, к которому происходит обращение. Разберем каждую из частей по отдельности.

Вывод результатов. Можно настроить вывод результатов на экран или перенаправить вывод в окно командного интерпретатора. Вы можете использовать функцию VBScript MsgBox или методы WSH Echo, Popup или StdOut.Write, в зависимости от того, что больше подходит для конкретной задачи.

Путь объекта WMI. Хотя путь объекта WMI является необязательным компонентом при использовании моникеров WMI, при написании однострочных сценариев его указывать необходимо. Этот компонент определяет путь к классу и свойство, которое будет использоваться в сценарии.

Уникальный идентификатор. Каждый класс содержит свойство, называемое уникальным идентификатором (используется также термин «ключевое свойство»). Например, для класса Win32_Service уникальным идентификатором является свойство Name, а для класса Win32_Process таким идентификатором будет свойство Handle. В однострочных сценариях для того, чтобы прочитать свойство класса, необходимо указать подходящий уникальный идентификатор. Например, для чтения свойства State службы Alerter класса Win32_Service необходимо указать Name в качестве уникального идентификатора, как показано во фрагменте А листинга 1. Как определить, какое из свойств является уникальным идентификатором класса, будет рассказано чуть позже.

Метод или свойство. Последним компонентом однострочного сценария является свойство или метод, вызываемый сценарием. Назовем этот компонент выполняемой частью сценария, поскольку именно он выполняет действие или считывает значение свойства объекта системы.

Теперь, разобравшись с составными элементами однострочных сценариев, мы должны научиться узнавать уникальный идентификатор класса, чтобы создавать однострочные сценарии для запуска из командной строки. Далее будет показано, как создавать однострочные сценарии программным путем.

Обнаружение уникального идентификатора

Как уже упоминалось, для создания сценариев необходимо указать уникальный идентификатор класса. То есть до написания запускаемого из командной строки однострочного сценария необходимо получить уникальный идентификатор класса.

Некоторые уникальные идентификаторы классов можно найти в документации WMI, содержащейся в библиотеке MSDN (Microsoft Developer Network, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_reference.asp). Но необходимо сразу отметить, что в документации содержатся не все уникальные идентификаторы, а для некоторых используются другие имена. Например, в документации класса Win32_Process уникальный идентификатор Handle назван идентификатором процесса.

Существует более простой способ определить уникальный идентификатор класса. Для этого достаточно запустить сценарий GetKeyProperty.wsf, представленный в листинге 2. Для запуска сценария воспользуйтесь командой

GetKeyProperty.wsf /c:ClassName

где ClassName - имя класса, уникальный идентификатор которого требуется узнать.

Сценарий GetKeyProperty.wsf представляет собой текстовый документ, соответствующий требованиями стандарта XML. С помощью файлов этого типа проще управлять параметрами сценария, чем посредством сценариев .vbs, в которых для обработки параметров командной строки необходимо разрабатывать собственный код. Например, представленный во фрагменте A листинга 2 именованный элемент определяет параметр /c, используемый для передачи имени класса в командной строке. Поскольку атрибуту required= именованного параметра присвоено значение true, при исполнении метода WScipt.Arguments.ShowUsage автоматически будет выдано сообщение, что параметр /c является обязательным. Как показывает фрагмент В, вызов метода WScipt.Arguments.ShowUsage происходит, если значение параметра sClassName не присвоено.

После того, как пользователь указал имя класса в командной строке, сценарий GetKeyProperty.wsf вызывает метод GetObject для подключения к службе WMI. Как только подключение установлено, сценарий с помощью метода Get получает коллекцию свойств указанного класса; полученная коллекция сохраняется в переменной colProperties. Далее уникальный идентификатор определяется с помощью вызова функции GetKeyProperty. Как показано во фрагменте D, функция перебирает все квалификаторы каждого свойства объекта и сравнивает имя описателя со значением key. В случае совпадения сценарий прерывает выполнение цикла с помощью Exit For и присваивает имя идентификатора переменной FoundKeyProperty.

После присвоения переменной FoundKeyProperty значения, сценарий GetKeyProperty.wsf выводит на экран имя класса и имя уникального идентификатора. При завершении работы сценарий освобождает занятую память.

Создание однострочных сценариев для запуска из командной строки

Для создания однострочных сценариев, запускаемых из командной строки, требуется выполнить только три шага. Например, здесь показано, как можно создать однострочный сценарий для получения описания указанной службы:

  1. Запустите текстовый редактор, например Блокнот.
  2. Введите строку кода сценария, приведенную в листинге 3.
  3. Сохраните файл под именем GetService_Description.vbs и закройте Блокнот.

Допустим, вы хотите воспользоваться сценарием GetService_Description.vbs для получения информации о службе winmgmt. Для запуска сценария откройте окно командного интерпретатора (Пуск, Выполнить, cmd.exe, ОК), введите команду

cscript /nologo getservice_description.vbs "winmgmt"

и нажмите Enter. Хотя эта команда занимает несколько строк, в окне командного интерпретатора она вводится в одну строку. То же самое справедливо для всех команд в данной статье. При выполнении сценарий подключается к службе WMI локального компьютера, выполняет запрос класса Win32_Service для получения информации о службе winmgmt и выводит описание.

Формирование однострочных сценариев программным способом

Самое интересное, что однострочные сценарии можно генерировать программно, вместо того, чтобы создавать их вручную. Сценарий GOLS.wsf (аббревиатура для Generate One-Line Scripts - создание однострочных сценариев) представляет собой пример такого сценария создания. GOLS.wsf определяет имя уникального идентификатора для указанного класса и формирует однострочный сценарий для выбранного свойства, после чего записывает сформированный сценарий в файл с расширением .vbs.

Для запуска сценария GOLS.wsf следует открыть окно командного интерпретатора, при необходимости перейти в нужный каталог, после чего выполнить команду:

cscript /nologo GOLS.vbs
 /c:ClassName /p:PropertyName

где ClassName - имя класса, а PropertyName - имя свойства, сценарий для использования которых предстоит создать. Этих сведений достаточно для автоматического формирования сценария для любого класса и свойства WMI, что избавляет вас от необходимости создавать эти сценарии вручную.

Листинг 4 представляет собой фрагмент сценария GOLS.wsf.

В первую очередь GOLS.wsf проверяет, были ли указаны в командной строке параметры ClassName и PropertyName. Если каких-то параметров не хватает, сценарий завершается с выводом на экран синтаксиса запуска. В противном случае, когда оба параметра указаны, соответствующие значения присваиваются переменным sClassName и sPropertyName. Далее создается объект доступа к файловой системе FileSystemObject, который будет использован для сохранения текстового файла.

Следующие несколько разделов в GOLS.wsf аналогичны уже рассмотренным разделам сценария GetKeyProperty.wsf. Сначала GOLS.wsf вызывает метод GetObject для подключения к службе WMI, затем метод Get для получения экземпляра указанного класса. Далее сценарий обращается к коллекции свойств указанного класса и сохраняет эту коллекцию в переменной colProperties. Для определения уникального идентификатора сценарий вызывает функцию GetKeyProperty.

Как показано в листинге 4, после определения имени уникального идентификатора сценарий GOLS.wsf создает новый текстовый файл, в который сохраняет однострочный сценарий для указанного параметром командной строки свойства, после чего закрывает результирующий файл. Наконец, сценарий завершает свою работу и освобождает занимаемую память. В каталоге, откуда был запущен сценарий GOLS.wsf, появится новый файл .vbs.

Рассмотрим для примера запуск GOLS.wsf для класса Win32_Printer, свойство Name. GOLS.wsf создает сценарий с именем getprinter_name.vbs, работоспособность которого можно протестировать, запустив из командной строки с соответствующим параметром. В нашем случае для сценария getprinter_name.vbs следует указать в качестве параметра имя принтера. Например, для тестирования работы сценария для принтера с названием "Brother HL-1240" следует выполнить команду

cscript /nologo getprinter_name.vbs
 "Brother HL-1240"

Упростите сбор данных

Как вы могли убедиться, однострочные сценарии удобно использовать для подключения, выполнения запросов и управления системой Windows. Такие сценарии можно вводить вручную или генерировать автоматически с помощью сценариев типа GOLS.wsf. Более того, теперь, зная принципы работы этого сценария, вы можете модифицировать его для автоматического формирования однострочных сценариев для любого метода классов WMI.


Листинг 1. Примеры однострочных сценариев
' НАЧАЛО ФРАГМЕНТА A
WScript.Echo "Alerter Service State: " & _ 
  GetObject("winmgmts:.
ootcimv2:win32_service.name='Alerter'").State
' КОНЕЦ ФРАГМЕНТАA
' НАЧАЛО ФРАГМЕНТА B
WScript.Echo "Alerter Service Stopped: " & _
  GetObject("winmgmts:win32_service.name='alerter'").StopService
WScript.Echo "Alerter Service Started: " & _ 
  GetObject("winmgmts:win32_service.name='alerter'").StartService
' КОНЕЦ ФРАГМЕНТА B

Листинг 2. GetKeyProperty.wsf

  
    
' НАЧАЛО ФРАГМЕНТА A
      
' КОНЕЦ ФРАГМЕНТА A
    
      
      
    



Листинг 3. Код сценария для ввода в Блокноте
WScript.Echo "Description: " &
 GetObject("winmgmts:win32_service.name='" & _
  WScript.Arguments(0) & "'").Description

Листинг 4. Фрагменты сценария GOLS.wsf
' BEGIN COMMENT
' Создаем однострочный сценарий для свойства класса.
' END COMMENT
Set objfile = objfs.CreateTextFile("get" & right(sClassName,
 len(sClassName)-6) & _
  "_" & sPropertyName & ".vbs")
' BEGIN COMMENT
' Сохраняем однострочный сценарий в текстовый файл и закрываем файл.
' END COMMENT
objfile.WriteLine "WScript.Echo VBNewLine & " & """" & sPropertyName & _
  ": " & """" & " & GetObject(" & """" & "winmgmts:" & sClassName & "." & _
  sKeyProperty & "='" & """" & " & WScript.Arguments(0) & " & _
  """" & "'" & """" & ")." & sPropertyName
objfile.Close