Сценарии WMI позволяют ответить на вопрос об установленных пакетах обновлений

Системные администраторы Windows должны быть уверены, что сопровождаемые ими системы находятся в актуальном состоянии. Пакет обновлений, service pack, для Windows является одним из наиболее важных факторов, определяющих актуальность состояния систем. ИT-структуры с большим бюджетом могут себе позволить приобрести специализированное программное обеспечение для управления, такое как Microsoft Systems Management Server (SMS), способное предоставлять отчеты об установленных пакетах обновления Service Pack. Но в небольших организациях нет соответствующих средств либо нет возможности управлять подобными решениями масштаба предприятия типа SMS.

Я написал два VBScript-сценария, позволяющих опрашивать удаленные компьютеры на предмет установленной на них операционной системы и пакета обновлений. Первый из сценариев, GetSP.vbs, выполняет соединение с удаленным компьютером и создает отчет об установленных на нем операционной системе и версии пакета обновлений. Второй сценарий, SPCheck.vbs, считывает список компьютеров из текстового файла и создает отчет, пригодный для импорта в электронную таблицу или базу данных.

На удаленных компьютерах должна быть установлена работающая система Windows 2000 или более поздняя. На компьютере, запускающем эти сценарии, должны быть установлены и запущены Windows 2000 и VBScript 5.6 либо Windows XP или более поздняя версия. VBScript 5.6 является частью операционной системы Windows XP и более поздних версий. Программа установки VBScript 5.6 (scripten.exe) для Windows 2000 доступна для загрузки с сайта Microsoft. Замечу, что если на машине установлен Microsoft Internet Explorer (IE) 6.0 или более поздний на Windows 2000, то VBScript 5.6 у вас уже есть.

Использование GetSP.vbs

Я написал GetSP.vbs, чтобы показать, как может использоваться Windows Management Instrumentation (WMI) для получения информации с удаленного компьютера. Хотя можно применять и другие инструменты (например, утилиту PsInfo от Sysinternals) для получения подобной информации, обычно приходится разбирать большой объем выходной информации для получения необходимых сведений о версии пакета обновлений. Короткий сценарий, основанный на WMI, такой как GetSP.vbs, может предоставить необходимые данные без использования других инструментов. Кроме того, можно при необходимости изменить сценарий для выполнения конкретных задач.

Синтаксис запуска сценария GetSP.vbs следующий:

GetSP.vbs [computername]

где computername — имя компьютера, для которого нужно получить версии операционной системы и пакета обновлений. Если не задать имя компьютера, то GetSP.vbs возвратит информацию о локальной машине.

Внутреннее устройство GetSP.vbs

Как показано в листинге 1, GetSP.vbs начинается с объявления имени сценария и постоянных. Для этого используется оператор Option Explicit, который предваряет объявление переменных. Затем сценарий задает значение постоянной SCRIPT_NAME и вызывает главную процедуру, выполняющую основную массу работы сценария.

Метка A на листинге 1 показывает текст главной процедуры. В процедуре объявляются несколько переменных, используется коллекция WScript.Arguments для разбора командной строки. В соответствии с общепринятыми соглашениями, если присутствует ключ /?, GetSP.vbs отображает короткое сообщение об использовании команды и завершает свою работу. Если командная строка содержит хотя бы один неизвестный аргумент (т. е. аргумент, не начинающийся с символа /), сценарий рассматривает этот аргумент как имя компьютера. Иначе сценарий будет полагать, что вы хотите получить информацию о локальном компьютере.

Затем сценарий отключает механизм обработки ошибок оператором On Error Resume Next, поскольку сценарий будет обрабатывать ошибки самостоятельно. Далее сценарий использует функцию VBScript GetObject для соединения с провайдером WMI на опрашиваемом компьютере. Метод InstancesOf — это WMI-метод, возвращающий коллекцию объектов заданного класса. В этом случае сценарий получает коллекцию WMI-объектов класса Win32_OperatingSystem, находящегося в пространстве имен rootCIMV2.

Если при выполнении функции GetObject возникает ошибка, обработчик сценариев выдает ошибку. GetSP.vbs использует объект Err для проверки на предмет наличия ошибок. По умолчанию свойством объекта Err является Number, поэтому его нельзя описать явно. Когда свойство Number объекта Err отлично от нуля, сценарий заканчивает свою работу и выводит сообщение об ошибке. Если ошибки отсутствуют, сценарий использует оператор On Error GoTo 0 и возвращает обработчик ошибок в исходное состояние.

С этого момента переменная objSystems содержит коллекцию объектов класса Win32_OperatingSystem. GetSP.vbs использует оператор For Each...Next для перебора коллекции даже в том случае, когда коллекция состоит из одного объекта, представляющего целевой компьютер. Затем сценарий использует метод Echo для вывода информации об этом компьютере. Он считывает свойство CSName для восстановления имени компьютера. Свойство Description получает описание компьютера (если оно задано), свойство Caption восстанавливает имя операционной системы, а свойство ServicePackMajorVersion получает версию пакета обновления service pack. Дополнительную информацию об этом и других свойствах класса Win32_OperatingSystem можно найти на http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_operatingsystem.asp.

Использование SPCheck.vbs

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

Синтаксис командной строки SPCheck.vbs следующий:

SPCheck.vbs inputfile outputfile
[/T:num] [/I:char] [/O:char]
[/S:lines] [/N]

где inputfile — имя текстового файла, содержащего список компьютеров. Этот файл должен иметь текстовый формат ASCII (т. е. не-UNICODE). Аргумент outputfile определяет имя выходного файла отчета. Этот файл не должен существовать до запуска сценария.

Ключ /T определяет номер number (num) атрибута, содержащего имя компьютера. Например, предположим, что входной файл содержит разделенные символом табуляции строки и выглядит так, как показано на рисунке. Первый атрибут содержит имя компьютера, второй содержит описание этого компьютера. В тех случаях когда имя компьютера не является первым атрибутом на каждой строке, можно использовать ключ /T для ввода номера позиции атрибута в строке. Например, /T:2 говорит SPCheck.vbs, что вторая позиция каждой строки содержит имя компьютера.

Рисунок. Пример входного файла, содержащего имена компьютеров и описания, разделенные запятыми
COMPUTER1 Development machine
COMPUTER2 Documentation machine

Ключ /I позволяет задать символ, разделяющий позиции в строках входного файла. Значением по умолчанию является символ табуляции. Если текстовый файл содержит какие-либо другие разделители, придется использовать ключ /I. Если текстовый файл содержит позиции, разделенные запятыми, придется задать ключ /I:. Если понадобится задать символ пробела, следует заключить его в двойные кавычки (т. е. /I:?? ??).

Ключ /O определяет символ разделителя для выходного файла. По умолчанию сценарий добавляет в выходной файл строку заголовка, затем для каждого из компьютеров, перечисленных во входном файле, в отчет добавляются следующие детали: имя компьютера name, описание description, операционная система OS, версия пакета обновления service pack version и код ошибки. Мы обсудим коды ошибок в следующей секции. По умолчанию позиции атрибутов разделены символом табуляции. Чтобы использовать другие символы разделителей, необходимо задать их при помощи ключа /O:, за которым следует нужный разделитель. Я не рекомендую использовать в качестве разделителей запятые и пробелы, поскольку эти символы встречаются в описании операционной системы.

В некоторых случаях входной файл может включать в себя заголовки. Для гарантии того, что SPCheck.vbs не будет читать заголовки, можно воспользоваться ключом /S, который заставляет сценарий пропускать строки заголовков. Например, если три первые строки входного файла являются заголовками, задав ключ /S:3 s, мы заставим сценарий пропустить первые три строки входного файла и начать чтение с четвертой строки. Ключ /N подавляет вывод строк заголовка в выходном файле.

Имена входного и выходного файлов должны быть первыми двумя аргументами командной строки. Другие аргументы, помимо этих, могут следовать в любом порядке. Например, для создания отчета с символом-разделителем (;) и именем report.txt, который будет получать информацию об именах компьютеров из файла mycomputers.txt, необходимо ввести следующую команду

spcheck.vbs mycomputers.txt
report.txt /o:;

Хотя эта команда представлена в статье в виде нескольких строк, вводить ее следует в одну строку. Это справедливо и для остальных команд, приведенных в статье. Можно импортировать report.txt в электронную таблицу либо в базу данных для дальнейшего анализа. Например, можно применить фильтр к столбцу OS и отсортировать по столбцу service pack для получения списка систем Windows XP, не обновленных до Service Pack 2 (SP2).

Создание входного файла

Можно создать входной файл для SPCheck.vbs несколькими путями. В домене Active Directory (AD) можно создать список компьютеров домена в различных форматах. Например, можно перейти к организационной единице (OU) в оснастке Active Directory Users and Computers консоли Microsoft Management Console (MMC), нажать правой кнопкой мыши на соответствующем OU, выбрать Export List для создания текстового файла с содержимым OU, разделенным запятыми, или символами табуляции. Текстовый файл будет содержать строку заголовка, поэтому понадобится ключ /S. Например,

spcheck.vbs myOU.txt /s:1
servicepacks.txt

сообщают SPCheck.vbs о необходимости обработать компьютеры, содержащиеся в файле myOU.txt, позиции признаков в котором разделены символами табуляции; при этом требуется пропустить первую строку, содержащую заголовок. Отчет должен быть сохранен в файле servicepacks.txt.

Другой способ получить список компьютеров предоставляет утилита командной строки Dsquery, входящая в состав Windows XP и более поздних версий. Например, следующая команда использует Dsquery для получения списка первых 500 компьютеров домена и создания файла отчета domaincomputers.txt:

dsquery computer -o rdn
-limit 500 > domaincomputers.txt

Ключ -o rdn выводит только относительные имена объектов DN (т. е. только имена компьютеров). В качестве альтернативы можно получить список компьютеров в OU и его ветвях из файла myOU.txt, используя команду

dsquery computer -o rdn
«OU=My OU,DC=mydomain,
DC=com»> myOU.txt

На выходе команды Dsquery каждое имя компьютера окружено двойными кавычками. SPCheck.vbs автоматически подавляет эти кавычки. Затем можно создать отчет, содержащий информацию о пакете обновлений компьютера в этом же файле, воспользовавшись командой наподобие следующей:

spcheck.vbs myOU.txt
servicepacks.txt

Внутреннее устройство SPCheck.vbs

Сценарий SPCheck.vbs слишком длинный, я не буду приводить его в статье полностью. Этот сценарий можно найти на сайте журнала в разделе downloads.

SPCheck.vbs начинается с объявления набора постоянных и глобальных переменных, которые будут содержать объект FileSystemObject. Затем сценарий передает управление главной процедуре, код которой представлен в листинге 2. После объявления и инициализации переменных блок With, выделенный во фрагменте А, проверяет коллекцию WScript.Arguments — параметры командной строки запуска сценария. Если среди параметров запуска присутствует ключ /? или число свободных аргументов менее двух (это означает, что не указаны имена входного и/или выходного файлов), сценарий вызывает процедуру Usage, которая выдает на экран сообщение о синтаксисе запуска сценария, и завершает работу.

Если оба обязательных аргумента указаны в командной строке, сценарий определяет имена входного и выходного файлов, символ разделитель и число строк, которые должны быть пропущены из начала входного файла (при необходимости), а также номер столбца данных, содержащего имя компьютера. Если в командной строке присутствуют ключи /S или /T, то с помощью функции GetNumber сценарий определяет количество аргументов в командной строке. При отсутствии этих ключей сценарий использует значения по умолчанию — 0 для /S и 1 для /T.

Далее сценарий SPCheck.vbs создает ссылку на объект FileSystemObject. Эта ссылка является глобальной переменной и доступна в любой процедуре сценария. Затем с помощью инструкции On Error Resume Next отключается стандартный обработчик ошибок, поскольку все возможные ошибки исполнения обрабатываются сценарием самостоятельно.

Далее создается объект TextStream, для чего выполняется вызов метода OpenTextFile объекта FileSystemObject. При ошибке выполнения метода OpenTextFile сценарий завершается сообщением об ошибке. Аналогичное действие выполняется при попытке открыть выходной файл. Перед попыткой открытия выходного файла производится проверка на предмет наличия такого файла, если же выходной файл уже имеется, сценарий завершает работу сообщением об ошибке.

Затем с помощью вызова метода SkipLine объекта TextStream сценарий SPCheck.vbs пропускает заданное параметром /S число строк входного файла. Если пропуск строк не производится (значение /S равно нулю), операторы цикла For Next не выполняются. Если в командной строке ключ /N не указан, сценарий записывает в выходной файл заголовок.

Сценарий использует оператор Do ... Loop для построчного считывания входного файла. Цикл выполняется до тех пор, пока свойство AtEndOfStream объекта TextStream не примет значение True, что является признаком достижения конца файла.

В начале цикла сценарий использует функцию GetToken для присвоения переменной strComputer имени удаленного компьютера. Если строка strComputer состоит хотя бы из одного символа (т. е. не является пустой строкой), сценарий вызывает функцию Alive для проверки доступности данного компьютера, т. е. отзывается ли компьютер на команду ping.

Если команда ping выполнена успешно, сценарий подключается к провайдеру WMI удаленного компьютера, чтобы получить доступ к коллекции объектов Win32_OperatingSystem. Если при выполнении ping компьютер недоступен, сценарий выдает сообщение о невозможности подключения к указанному компьютеру с кодом ошибки 1. Если подключение WMI невозможно, сценарий выводит сообщение об ошибке с указанием кода ошибки WMI. В противном случае (если все нормально) сценарий выводит имя компьютера, описание, операционную систему, уровень пакетов исправлений и код 0 (ошибок нет).

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

Как работает функция GetToken. GetToken представляет собой универсальную функцию для синтаксического разбора входной строки на лексические элементы с использованием указанного символа разделителя. Пример обращения к функции GetToken представлен во фрагменте B листинга 2. Функция использует три параметра: входной текстовый поток, используемый разделитель и номер лексемы, которую следует извлечь. В данном случае сначала используется метод ReadLine объекта TextStream для чтения входной строки из входного файла. Переменная strInputDelim указывает разделитель, представляющий собой символ из командной строки, если был указан ключ /l или символ табуляции, если ключ /l в командной строке указан не был. Переменная lngToken указывает номер лексемы, который задан в командной строке с ключом /T, или 1, если ключ /T не указан.

Как работает функция Alive. Поскольку обращение к WMI занимает довольно много времени при попытке подключения к неработающему удаленному компьютеру, SPCheck.vbs сначала использует функцию Alive для определения, включен ли удаленный компьютер. Как видно из фрагмента C листинга, единственным аргументом при вызове функции является имя компьютера, к которому вы собираетесь подключиться (strComputer).

Сначала функция Alive создает временный файл и вызывает команду Ping.exe для проверки отклика от удаленного компьютера. Вывод программы Ping перенаправляется во временный файл, считывая который функция определяет, доступен ли компьютер в данный момент. В зависимости от доступности компьютера Alive возвращает значение True или False.

Нужно иметь в виду, что полностью полагаться на возвращаемое функцией Align значение не стоит. Например, если на удаленных компьютерах Windows XP SP2 включен брандмауэр Windows с настройками по умолчанию, то запросы Ping будут игнорироваться, и сценарий SPCheck.vbs не будет пытаться подключиться к таким компьютерам. Так что, если на компьютерах используется локальный брандмауэр, следует либо запретить применение брандмауэра, либо разрешить в брандмауэре ответ на запрос Ping и подключение к WMI. Сведения о ручной настройке Windows Firewall в XP SP2 можно найти на сайте Microsoft в статьях http://www.microsoft.com/technet/community/ columns/cableguy/cg0204.mspx и http://msdn.microsoft.com/library/default.asp?url=/library/en- us/wmisdk/wmi/ connecting_through_windows_firewall.asp. Об использовании групповых политик для настройки брандмауэра Windows Firewall рассказывается в статье http://www.microsoft.com/technet/prodtechnol/ winxppro/maintain/mangxpsp2/mngwfw.mspx.

Удобное средство создания отчетов

Сценарии GetSP.vbs и SPCheck.vbs предоставляют простой способ получения информации об операционных системах и установленных пакетах обновлений на удаленных сетевых компьютерах. Можно адаптировать эти сценарии для получения другой необходимой информации о сетевых компьютерах, которая доступна через свойства класса Win32_OperatingSystem. Например, можно таким образом получать сведения об объеме физической и виртуальной памяти на компьютерах, для этого следует считать свойства FreePhysicalMemory и FreeVirtualMemory. В любом случае сценарии GetSP.vbs и SPCheck.vbs будут полезны для инвентаризации компьютеров сети.


Билл Стюарт - Cистемный и сетевой администратор компании French Mortuary, Нью-Мехико. bill.stewart@frenchmortuary.com