Инвентаризация компьютеров средствами WMI и VBScript
Инвентаризация компьютеров при помощи данного скрипта поможет системному администратору решить следующие задачи в масштабе небольшой организации:
- Подготовка отчета о количестве, размещении и составе системных блоков для бухгалтерии. Информацию о других основных средствах (мониторах, ИБП, принтерах и т. п.) придется собирать другими способами.
- Отслеживание изменений в конфигурации компьютеров, в том числе — выявление случаев самовольной замены комплектующих.
- Поиск, отбор и подсчет компьютеров с заданными характеристиками при планировании закупок или при решении каких-либо технических вопросов.
Возможности и особенности
Предлагаемый скрипт позволяет:
- Собирать сведения о конфигурации множества компьютеров тремя разными способами — локально (если нет доступа по сети), удаленно (с рабочего места администратора), через logon-скрипт.
- Сохранять отчеты о конфигурации компьютера в структурированный текстовый файл формата CSV, удобный для последующей автоматизированной обработки.
- Создавать настраиваемый общий отчет по всем имеющимся компьютерам.
Отличительные особенности скрипта:
- Используются встроенные в Windows 2000/XP/2003/Vista компоненты VBScript и WMI. Установка и лицензирование дополнительных программ не требуется.
- В программном коде можно настроить состав и структуру отчета под свои нужды. При желании не трудно добавить вывод отчетов в других текстовых форматах (TXT, INI, HTML, XML), удобных для просмотра, печати или импорта в других программах.
- Собираются и выводятся в отчет только действительно нужные для решения поставленных задач сведения. Скрипт не предназначен для сбора исчерпывающей информации о составе системного блока.
Загрузка и установка
Скрипт для инвентаризации компьютеров средствами WMI и VBScript, упакован ZIP: invent_comp.zip
Установка не требуется, достаточно распаковать архив в отдельный каталог на рабочей станции администратора.
Первый этап работы — сбор данных
Скрипт invent_comp.vbs собирает данные о конфигурации указанного компьютера и сохраняет отчет в формате CSV в заданный локальный каталог или на сетевой ресурс. Имя файла отчета соответствует сетевому имени компьютера. Есть несколько вариантов запуска.
Вариант 1 — для тестирования или для отдельных сетевых компьютеров и серверов
Для проверки скрипта при первом знакомстве, а также для сбора данных с серверов и отдельных компьютеров не дожидаясь их перезагрузки, можно запускать скрипт вручную, с рабочего места администратора. При этом достаточно использовать настройки по умолчанию, тогда отчеты будут сохраняться в подкаталог рядом со скриптом:
Const SILENT = FALSE 'тихий режим отключен, будет запрошено имя компьютера
Const DATA_DIR = "comp\" 'локальный каталог + "\" в конце
Вариант 2 — для сетевых рабочих станций
Скрипт может работать в «тихом» режиме, т. е. не выводить диалоги, собирать данные о локальном компьютере и сохранять отчет на заранее определенный сетевой ресурс. Таким образом возможен автоматический запуск на всех рабочих станциях сети, например при их включении. Для этого варианта запуска лучше создать и использовать отдельную копию файла.
Сначала необходимо выделить сетевой ресурс для сохранения отчетов и дать разрешение на запись пользователю (или группе пользователей), от имени которого будет запускаться скрипт.
Настройки в самом скрипте такие:
Const SILENT = TRUE 'режим отчета о локальном компьютере, без вывода диалогов
Const DATA_DIR = "\\SRV\Invent\comp\" 'сетевой ресурс + "\" в конце
Затем следует настроить запуск скрипта через logon-скрипт или групповую политику. Необходимо учитывать, что для обращения к компоненту WMI нужны права администратора — поэтому в групповой политике лучше включать скрипт в конфигурацию компьютера, а не пользователя.
Вариант 3 — для компьютеров, не подключенных к сети
Если есть компьютеры, данные по которым невозможно собрать другими способами, можно скопировать скрипт на переносной диск и запускать с него. Настройки взять из варианта 1, собранные отчеты добавить к остальным.
Формат отчета с результатами
Результаты сохраняются в текстовый файл формата CSV. Каждая строка файла состоит из 4 полей, разделенных символом ; («точка с запятой»):
- Тип компонента — используется для группировки
- Название параметра
- Номер экземпляра (целое число) — нужен для различения нескольких компонентов одного типа
- Значение параметра
Если в значении какого-либо параметра встретится символ ;, он будет заменен на символ _. Значения полей не заключаются в кавычки. Первая строка содержит заголовки столбцов. При желании можно отключить добавление этой строки в настройках:
Const HEAD_LINE = False 'НЕ выводить заголовки в первой строке CSV-файла
Пример отчета:
Секция отчета;Параметр;Номер экземпляра;Значение
Компьютер;Дата проверки;1;10.06.2009 22:33:44
Компьютер;UUID;1;67DB3380-FEB7-11D5-8ED2-001E8CAD784C
Компьютер;Сетевое имя;1;COMP
Компьютер;Домен;1;WORKGROUP
Компьютер;Владелец;1;User
Компьютер;Текущий пользователь;1;COMP\Pavel
Компьютер;Объем памяти (Мб);1;2047
Операционная система;Наименование;1;Microsoft Windows XP Professional
Операционная система;Версия;1;5.1.2600
Операционная система;Обновление;1;Service Pack 3
Операционная система;Зарегистрированный пользователь;1;User
Операционная система;Серийный номер;1;XXXXX-XXX-XXXXXXX-XXXXX
Операционная система;Организация;1;1
Операционная система;Дата установки;1;06.08.2008 12:34:56
Материнская плата;Производитель;1;ASUSTeK Computer INC.
Материнская плата;Наименование;1;P5KPL-VM
Материнская плата;Версия;1;x.xx
Материнская плата;Серийный номер;1;MT7082K06808353
BIOS;Производитель;1;American Megatrends Inc.
BIOS;Наименование;1;BIOS Date: 07/28/08 14:07:15 Ver: 08.00.12
BIOS;Версия;1;0904
BIOS;Серийный номер;1;System Serial Number
Процессор;Наименование;1;Intel(R) Core(TM)2 Duo CPU E8200 @ 2.66GHz
Процессор;Описание;1;x86 Family 6 Model 23 Stepping 6
Процессор;Частота (МГц);1;2664
Процессор;Частота FSB (МГц);1;333
Процессор;Размер L2-кеша (кб);1;6144
Процессор;Разъем;1;Socket 775
Модуль памяти;Размер (Мб);1;1024
Модуль памяти;Частота;1;800
Модуль памяти;Размещение;1;DIMM A1
Модуль памяти;Размер (Мб);2;1024
Модуль памяти;Частота;2;800
Модуль памяти;Размещение;2;DIMM B1
Диск;Наименование;1;WDC WD3200AAKS-00C9A0
Диск;Размер (Гб);1;298
Диск;Интерфейс;1;IDE
Логический диск;Наименование;1;C:
Логический диск;Файловая система;1;NTFS
Логический диск;Размер (Гб);1;32
Логический диск;Свободно (Гб);1;14
Логический диск;Серийный номер;1;8C959CAC
CD-привод;Наименование;1;Optiarc DVD RW AD-5200A
Второй этап работы — составление общего отчета
Полученные на первом этапе отчеты можно не только просматривать по-отдельности, но и свести в одну таблицу. Скрипт invent_comp_report.vbs просматривает заданный каталог и из всех найденных там отчетов извлекает данные.
Перед запуском надо проверить настройки в тексте скрипта:
Const DATA_DIR = "comp\" 'каталог для сохранения отчетов + "\" в конце
Const DATA_EXT = ".csv" 'расширение файлов с данными
Const HEAD_LINE = True 'пропустить первую строку в файле CSV - заголовок
Const REPORT_FILE = "comp_report_%DATE%.htm" 'файл для сохранения отчета
Не все данные из отдельного отчета нужны в общем отчете. Какие столбцы и в каком порядке попадут в общий отчет определяется в программном коде через массив:
'количество, порядок и названия столбцов отчета
'значения должны соответствовать первым двум полям CSV файла!
Dim col(21) '
После запуска скрипта invent_comp_report.vbs будет создан файл в формате XHTML, который можно открыть в браузере, импортировать в OpenOffice.org Calc или Microsoft Excel (не проверено).
В таблице каждому компьютеру соответствует одна строка. Если на компьютере есть несколько комплектующих одного типа, то они оформляются в виде списка.
Для дополнительной обработки табличного отчета и вывода на печать предлагается использовать специально предназначенные для этого программы, например, OpenOffice.org Calc.
Тонкая настройка скрипта
Добавление и удаление параметров
Какие параметры и в каком порядке попадут в отчет определяется в программном коде процедуры InventComp. Каждой секции отчета, содержащей сведения по всем экземплярам какого-либо класса компонентов, соответствует один вызов подпрограммы Log. Вот пример:
Log "Win32_ComputerSystem", _
"Name,Domain,PrimaryOwnerName,UserName,TotalPhysicalMemory", "", _
"Компьютер", _
"Сетевое имя,Домен,Владелец,Текущий пользователь,Объем памяти (Мб)"
Параметры вызова подпрограммы разнесены на несколько строк для наглядности. Третий параметр чаще всего — пустая строка, и поэтому расположен на одной строке со вторым.
Пояснение к параметрам данного вызова подпрограммы:
- «Win32_ComputerSystem» — класс WMI, к которому идет запрос
- «Name,Domain,PrimaryOwnerName... — свойства WMI (через запятую), значения которых надо включить в отчет
- »» — условие отбора по правилам WQL (подробности далее), или пустая строка.
- «Компьютер» — название соответствующей секции отчета, выводится в первом столбще CSV-файла.
- «Сетевое имя,Домен,Владелец... — названия параметров (через запятую), соответствующих перечисленным выше свойствам WMI, в том же порядке и количестве, выводится во втором столбце CSV-файла.
Чтобы корректно добавить или изменить подобный вызов, необходимо найти и изучить документацию по соответствующему WMI-классу:
- Описание классов WMI в MSDN
- WMI Platform SDK, если удастся найти
Также для составления и тестирования запросов к WMI можно использовать программы:
- Microsoft WMI Object Browser — работает через web-интерфейс, входит в состав «WMI Administrative Tools»
- WMI Explorer — не требует установки, автор Alexander Kozlov
Удаление ненужных значений
Чтобы в отчет не попадали отключенные сетевые адаптеры, минипорты и виртуальные адаптеры VMware, в запросе к классу Win32_NetworkAdapter добавлено условие:
"NetConnectionStatus > 0 AND NOT (Name LIKE 'VMware%')"
Чтобы в отчет попадали только локальные принтеры, подключенные через порт USB или LPT, в запросе к классу Win32_Printer добавлено условие:
"(Local = True OR Network = False) AND (PortName LIKE '%USB%' OR PortName LIKE '%LPT%')"
Чтобы в секцию отчета «Диск» попадали данные только о жестких дисках, в запросе к классу Win32_DiskDrive добавлено условие:
"InterfaceType <> 'USB'"
Соответственно, чтобы в секцию отчета «Логический диск» также попадали данные только о разделах жестких дисков, в запросе к классу Win32_LogicalDisk добавлено условие:
'DriveType = 3 - только локальные диски
'пропускаются USB-диски, размер которых обычно NULL
"DriveType = 3 AND Size IS NOT NULL"
В Windows 2000 компонент WMI не поддерживает некоторые WMI-классы, например сетевые адаптеры и принтеры. Причем, если все-таки отправить некорректный запрос, не вернется ни ответа, ни сообщения об ошибке — создание отчета просто прекратится. Поэтому добавлена проверка версии WMI-сервера — запрос выполняется только если номер сборки операционной системы больше или равен 2600 (Windows XP/2003):
If build >= 2600 Then
Log "Win32_NetworkAdapter", _
If build >= 2600 Then
Log "Win32_Printer", _
Видеоадаптеры ATI, имеющие два выхода отображаются как два отдельных адаптера, причем в названии второго есть слово «Secondary». Чтобы в отчете не отображались такие «двойники», в запросе к классу Win32_VideoController добавлено условие:
"NOT (Name LIKE '%Secondary')"
Формат значений
Размер дисков и объем памяти в WMI выдается в байтах. Чтобы в отчете значения какого-либо параметра выводились в более привычных кратных единицах, достаточно в конце названия параметра добавить условные символы (Мб) или (Гб). В скрипте есть проверка этих условных символов:
'если указана кратная единица измерения, перевести значение
ElseIf Right(names(i), 4) = "(Мб)" Then
value = CStr(Round(value / 1024 ^ 2))
ElseIf Right(names(i), 4) = "(Гб)" Then
value = CStr(Round(value / 1024 ^ 3))
Значения, имеющие тип «дата и время» распознаются по свойству CIMType и автоматически преобразуются в читаемый вид:
'если тип данных - дата, преобразовать в читаемый вид
ElseIf prop.CIMType = 101 Then
value = ReadableDate(value)
Если значение является массивом (например, перечень поддерживаемых форматов бумаги у принтера — свойство PrinterPaperNames класса Win32_Printer), то все значения автоматически «склеиваются» в строку с запятой в качестве разделителя:
'если тип данных - массив, собрать в строку
ElseIf IsArray(value) Then
value = Join(value,",")
Возможные проблемы и способы их устранения
При тестировании скрипта замечены такие ошибки:
Проблема | Вероятная причина | Как устранить |
Сообщение «Компьютер удаленного сервера не существует или недоступен» | Доступ к службе WMI удаленного компьютера заблокирован брандмауэром. | Отключить службу брандмауэра, подключившись к удаленному компьютеру через консоль (оснастку) «Управление компьютером». |
Сообщение «Разрешение отклонено» | Не удается создать новый или обновить существующий файл отчета. | Проверить, что в настройках скрипта указан нужный каталог для сохранения отчетов, файл отчета не занят другой программой и для него не установлен атрибут «только чтение», у скрипта достаточно разрешений на запись. |
Сообщение «Объект не поддерживает это свойство или метод» | Некоторые свойства объектов WMI не поддерживаются Windows 2000. При обращении к таким свойствам возникает ошибка. Например, при подключении к Windows 2000 такую ошибку вызывает обращение к свойствам ’NetConnectionStatus’, ’AdapterType’ элемента коллекции ’Win32_NetworkAdapter’. | Проверить в документации по WMI, какие свойства не поддерживаются в некоторых ОС и перед обращением к таким свойствам проверять версию ОС или вообще их не использовать. |
Неправильно определяется процессор Intel Core 2 в XP | Это неточность компонента WMI, см. статью Microsoft на эту тему. Цитата: `The data that is returned indicates that the CPU name is «Intel Pentium III Xeon» or «Intel Pentium III.» However, System Properties or System Information (MSInfo32.exe) shows the name as «Intel(R) Core(TM)2 Duo CPU E8000»`. | В упомянутой статье есть ссылка для загрузки исправления. |
Неправильно определяется процессор Intel Celeron в XP | Это неточность компонента WMI, см. статью Microsoft на эту тему. | В упомянутой статье есть ссылка для загрузки исправления. |
Не появляется окно «Отчет сохранен в файл», создание отчета останавливается | Отправлен некорректный WMI-запрос — допущена синтаксическая ошибка или запрошенное свойство не поддерживается. | Найти, исправить или отключить некорректный WMI-запрос. |