Михаил Кошкин
Достаточно часто в администрировании приходится сталкиваться с разовыми
задачами, программные решения для которых под рукой отсутствуют, а путешествие
по Интернету не приносит требуемого результата. Для таких случаев в
операционной системе Windows панацеей практически от всех бед может стать Windows
Scripting Host. Его возможности позволят вам в короткие сроки составить нужный
алгоритм и решить возникшую проблему.
Сегодня мы рассмотрим возможности Windows Scripting Host для получения
основных характеристик компьютерных систем, которые могут быть использованы,
например, для решения задач инвентаризации технических средств, учета
пользователей, работающих в локальной сети, и даже при проведении
криминалистической экспертизы компьютерной техники.
Примеры скриптов на языке VBScript, приведенные в
статье, разработаны и протестированы для W2K. В большинстве своем они могут
быть использованы и при работе под управлением Windows 98 или ME без установки
дополнительного программного обеспечения.
Носители информации
Изучение компьютеров практически во всех случаях требует индивидуальных
подходов, особенности которых определяются результатами первичного анализа,
задействованного при работе оборудования, версий и настроек установленных
операционных систем и прикладных программ, а также данных, которые могли быть
созданы и отредактированы пользователем.
Ниже приведена общая структура кода программы,
позволяющая определить, какие устройства для хранения информации (далее –
диски) имеются в системе.
' Получение доступа к
объектам FileSystem Object
Dim fso : Set fso = WScript.CreateObject("Scripting.FileSystemObject")
' Перебираем все диски (HDD,
FDD, CD и др.), имеющиеся в системе
Dim i
For Each i In fso.Drives
….
Next
В теле цикла с использованием дескриптора,
содержащегося в переменной i, могут быть получены такие свойства (из наиболее
значимых в рамках тематики статьи), как: буква диска – i.DriveLetter; тип диска
– i.DriveType (см. таблицу 1).
Таблица 1. Возможные значения
типа диска для i.DriveType
|
Значение
|
Пояснение
|
|
0
|
Тип не может быть определен
|
|
1
|
Сменный носитель или дисковод для гибких дисков
|
|
2
|
Том, размещенный на HDD-диске
|
|
3
|
Сетевой диск
|
|
4
|
CD / DVD-ROM
|
|
5
|
Виртуальный RAM-диск
|
Кроме того, с использованием
дескриптора доступа к элементам файловой системы fso дополнительно могут быть
получены все основные характеристики носителя:
n тип файловой системы носителя – fso.GetDrive(i.DriveLetter).FileSystem;
n серийный номер тома – Hex(fso.GetDrive(i.DriveLetter).SerialNumber);
n метка тома – fso.GetDrive(i.DriveLetter).VolumeName;
n общий размер диска – FormatNumber (fso.GetDrive(i.DriveLetter).TotalSize
/1048576, 1) & " Мб");
n размер незанятого пространства диска – FormatNumber
(fso.GetDrive(i.DriveLetter).FreeSpace /(1024*1024), 1) & " Мб").
При разработке кода программы необходимо
учитывать то обстоятельство, что в считывающем устройстве необязательно
присутствие носителя (дискеты в дисководе или диска CD в приводе), и при
обработке функций для получения свойств носителя могут возникнуть ошибки. Для
таких случаев в языке VBScript используются конструкции On Error Resume Next, Err.Number
и Err.Clear, позволяющие пользователю сформировать код для самостоятельной
обработки исключений (см. рис. 1).

Рисунок 1. Результаты
обработки информации об имеющихся в системе дисках
Следует также предусматривать ситуации, когда
диски появляются в системе лишь на некоторое время. Это может быть связано с
подключением сетевых дисков, наличием сменных USB flash или шифрованных дисков.
Некоторые подходы, позволяющие определить, с какими дисками пользователю
приходилось иметь дело, будут изложены далее.
Поиск файлов
Если задаться целью найти все файлы-контейнеры для шифрованных дисков, то
эта задача может быть решена, например, путем проверки содержимого всех файлов,
размещающихся на диске, на предмет наличия в них определенной комбинации байт-сигнатуры.
Кроме того, большинство известных программ работы с шифрованными дисками
регистрируют в операционной системе определенные расширения файлов,
ассоциируемые с файлами-контейнерами, что позволяет сузить круг поиска
интересующих файлов до проверки наличия в имени определенного расширения.
Ниже приводится структура рекурсивной процедуры
обхода подкаталогов для решения задачи поиска на диске файлов, обладающих
необходимыми свойствами.
Sub WorkSubFolder(sdrivename)
Dim sfolder : set sfolder=fso.getfolder(sdrivename)
' Для работы с подкаталогами
источника
Dim ssfolder : set ssfolder=sfolder.SubFolders
' Для работы с файлами
каталога источника
Dim ssfiles : set ssfiles=sfolder.Files
Dim fo
' Цикл обработки подкаталогов
каталога источника
For Each fo In ssfolder
WorkSubFolder SDriveName&"\"&fo.name
Next
' Для всех файлов текущего
каталога вызывается процедура WorkForFile
Dim fi : For Each fi In ssfiles
: WorkForFile sfolder&"\"&fi.name : Next
End sub
Файлы, имена которых содержат интересующее
расширение, могут быть найдены с применением функции fso.Get-ExtensionName(fullnamefile)
(см. рис. 2).

Рисунок 2. Результаты поиска
файлов, имеющих заданные расширения
Для поиска файлов с определенной сигнатурой в
простейшем случае достаточно воспользоваться функциями открытия файла (fr=fso.OpenTextFile(FullNameFile,
1, false)), чтения данных из файла (s_read=fr.Read(1)) и закрытия файла (fr.Close)
(см. рис. 3).

Рисунок 3. Результаты поиска
файлов-контейнеров шифрованных дисков с использованием заданной сигнатуры
При работе с томами файловой системы NTFS будьте
готовы к ситуациям, когда доступ с правами пользователя к некоторым
подкаталогам будет запрещен (например, «System Volume Information», который
размещается в корневом каталоге тома). Необходимо также учитывать то
обстоятельство, что при значительных размерах дисков и большом количестве
файлов поиск может выполняться достаточно продолжительное время.
Ярлыки
Информацию о пристрастиях пользователя можно почерпнуть при изучении
файлов-ярлыков, которые формируются при различных обстоятельствах (будь то
история работы с файлами Microsoft Office или раздел Recent). Для анализа
достаточно обработать дату создания файла, являющегося ярлыком, и параметр TargetPath,
в котором содержится информация о запускаемом файле.
Dim wshshell : Set wshshell =
WScript.CreateObject("WScript.Shell")
Dim shortcut : Set shortcut =
wshshell.CreateShortcut(fullnamefilelnk)
' Вывод информации с
названием и полным путем к запускаемому файлу
WScript.Echo( shortcut.TargetPath
)
Dim fso : Set fso=CreateObject("Scripting.FileSystemObject")
Dim filelnk : Set filelnk = fso.getfile(строка
с полным названием файла-ярлыка)
' Вывод информации о дате
создания файла-ярлыка
WScript.Echo( filelnk.DateCreated
)
При этом может обнаружиться, что пользователь
открывал файлы с дисков, которые в системе отсутствуют, что может
свидетельствовать о наличии у пользователя сменного USB-накопителя или
использовании секретного шифрованного диска.

Рисунок 4. Результаты поиска
файлов-ярлыков в двух пользовательских каталогах
Документы Word
Возможности использования элементов ActiveX позволяют серьезно расширить
область применения пользовательских программ на VBScript. Примером этому может
стать описание подхода получения метаданных документов Microsoft Word. К слову
сказать, за последние три года содержимое метаданных послужило поводом для ряда
неприятных историй с крупными компаниями и даже государствами (случаи с досье
правительства Британии о военном потенциале Ирака и исковым заявлением компании
SCO).
Следующий пример демонстрирует возможность
получения метаданных для документа Microsoft Word, а также позволяет отследить
ситуации, когда документ зашифрован с использованием пароля.
On Error Resume Next
Dim wordapp : Set wordapp = WScript.CreateObject("Word.Application")
' Открываем файл fullnamefile
с документом Word с паролем " "
Dim doc
Set doc = wordapp.Documents.Open(fullnamefile,
_
False,
_
blnReadOnly,_
False,
"
")
If Err.Number = 5408 then
' Обработка файла с
документом Word, который имеет пароль
End if
' Метаданные с
пользовательскими свойствами документа
Dim propitem
For Each propitem In wordapp.ActiveDocument.CustomDocumentProperties
' В цикле обрабатываются propitem.Type
и propitem.Value
Next
' Метаданные со стандартными
свойствами документа
For Each propitem In wordapp.ActiveDocument.BuiltInDocumentProperties
' В цикле обрабатываются propitem.Type
и propitem.Value
Next
Err.Clear
On Error GoTo 0

Рисунок 5. Результаты
обработки свойств документов MS Word
Следует отметить, что документы Microsoft
Word могут содержать и другие метаданные, которые нельзя получить путем
применения стандартных функций работы с документами Word, для этого требуется
визуальный контроль содержимого. В файле могут обнаружиться такие данные, как:
n имя и полный путь к файлу с документом;
n адреса электронной почты или информация о веб-сервере;
n имена принтеров;
n текстовые фрагменты, удаленные из документа в
некоторый момент до сохранения;
n текстовые фрагменты из других документов, не
имеющих отношения к данному, попавшие в него из-за ошибок в Microsoft Word.
Переменные среды и данные
реестра
Если подходы, описанные в предыдущих разделах, достаточно универсальны и
позволяют исследовать содержимое отдельных носителей информации, то далее речь
пойдет о возможностях VBScript, которые требуют запуска скриптов на исследуемом
компьютере либо выполнения программ под управлением изучаемой операционной
системы.
Обработка с использованием VBScript переменных
среды для системы Windows поможет ответить на вопрос, относится ли операционная
система к Win9x или W2K, а также получить информацию о некоторых особенностях
установки и настройки операционной системы.
Dim wshshell : Set wshshell =
WScript.CreateObject("WScript.Shell")
Dim wshproenv : Set wshproenv
= wshshell.Environment("PROCESS")
wshproenv (var_env)
Таблица 2. Возможные значения
строкового параметра var_env для W2K
|
Значение параметра
|
Пояснения
|
|
Данные об
операционной системе
|
|
OS
|
Операционная система
|
|
WINDIR
|
Каталог системных файлов*
|
|
PROGRAMFILES
|
Каталог установки программ
|
|
PATH
|
Путь поиска*
|
|
COMPUTERNAME
|
Название компьютера
|
|
Данные о текущем
сеансе пользователя
|
|
USERNAME
|
Имя пользователя
|
|
USERPROFILE
|
Каталог пользователя
|
|
TEMP
|
Каталог временных файлов*
|
Примечание:
* параметр может
использоваться для Win9x и WinME.
Основная информация, особенности настройки
операционной системы и прикладных программ сосредоточены в реестре, из которого
можно почерпнуть большое количество полезной информации (см. рис. 6).

Рисунок 6. Результаты
обработки значений некоторых ключей реестра
Как известно, данные реестра хранятся в
нескольких файлах, которые размещаются в системном и пользовательском
каталогах. В случае, если на компьютере установлено несколько операционных
систем, возможности VBScript позволяют обработать данные реестра лишь для
текущей загруженной системы Windows. Другим ограничением VBScript при работе с
реестром является отсутствие возможностей для перебора всех ключей,
содержащихся в заданном разделе, что не позволяет программно обработать другую
полезную информацию, хранимую в реестре.
WMI
В случаях, если есть возможность запустить скрипт под управлением изучаемой
операционной системы версии W2К, полезную информацию можно получить используя Microsoft
Windows Management Instrument (WMI). Достаточно подробно подходы работы с WMI
описаны в статьях Ивана Коробко, опубликованных в журнале «Системный
администратор» в 2004 г. В общем случае код инициализации работы с WMI выглядит
следующим образом.
' Подключение к службе WMI
локального компьютера
Dim wbemservices
Set wbemservices = GetObject("winmgmts://127.0.0.1/Root/Cimv2")
Таблица 3. Ключи, которые
могут представлять интерес при изучении компьютера
|
Значение
|
Пояснение
|
|
Параметры,
определяемые в ходе установки системы.
Ветвь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
|
|
ProductName
|
Название продукта*
|
|
CurrentVersion
|
Версия продукта**
|
|
ProductId
|
ID продукта*
|
|
CSDVersion
|
Обновление
|
|
RegisteredOwner
|
Имя пользователя (указанное при установке системы)*
|
|
RegisteredOrganization
|
Название организации (указанное при установке системы)*
|
|
SystemRoot
|
Каталог установки*
|
|
SourcePath
|
Источник установки
|
|
InstallDate
|
Дата установки
|
|
Данные об
автоматическом входе пользователя в систему.
Ветвь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
|
|
AutoAdminLogon
|
Автоматический вход (значение 1)
|
|
DefaultUserName
|
Имя пользователя по умолчанию
|
|
DefaultDomainName
|
Название домена по умолчанию
|
|
Ветка HKEY_CURRENT_USER\Environment
|
|
TEMP
|
Каталог временных файлов пользователя
|
|
Информация по переменным
среды.
Ветвь HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session
Manager\Environment
|
|
TEMP
|
Каталог временных файлов системы
|
|
Windir
|
Каталог системных файлов
|
|
PATHEXT
|
Путь поиска
|
|
Размещение
некоторых стандартных каталогов Windows.
Ветвь HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders
|
|
Local Settings
|
Каталог локальных настроек
|
|
Personal
|
Каталог «Мои документы»***
|
|
Recent
|
Каталог хранения lnk раздела «Документы» меню «Пуск»**
|
|
Startup
|
Каталог хранения lnk раздела «Автозагрузка»**
|
|
Настройки экранной заставки. Ветвь HKEY_CURRENT_USER\Control
Panel\Desktop
|
|
SCRNSAVE.EXE
|
Включение заставки (указывает наличие значения ключа)
|
|
ScreenSaverIsSecure
|
Включение парольной защиты экрана (значение 1 и наличие
заставки)
|
Примечание:
* ключи используются также в
Win98 и WinME (название раздела «Windows NT» следует изменить на «Windows»);
** ключи применяются в WinME.
Таблица 4. Для Win98 и WinME
используются отдельные ключи, располагающиеся в других ветвях
|
Значение
|
Пояснение
|
|
Настройки экранной
заставки. Ветвь HKEY_CURRENT_USER\Control Panel\Desktop
|
|
ScreenSaveActive
|
Включение заставки (значение 1)
|
|
ScreenSaveUsePassword
|
Включение парольной защиты экрана
(значение 1 и наличие заставки)
|
|
Ветвь HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
|
|
ProductKey
|
Ключ продукта
|
Далее следует использовать информацию с
названиями необходимых классов и их свойств, знание о которых можно почерпнуть
в процессе изучения объектной модели WMI с помощью утилиты WMI Object Browser.
Так, например, получить данные, о включенных на момент проверки сетевых
интерфейсах, можно с помощью следующего кода.
Dim objectitems
Set objectitems = wbemservices.ExecQuery("Select
* from Win32_NetworkAdapter")
Dim objectitem
For Each objectitem In objectitems
If objectitem.MacAddress<>""
then
WScript.echo("Сетевая
карта название: " + objectitem.Name + Chr(13) + _ " производитель: \
" & objectitem.Manufacturer
+ Chr(13) + _ " MAC: " & objectitem.MacAddress)
End if
Next
Использование возможностей WMI
позволяет разработчику сценария на языке VBScript получить:
n информацию об установленном в системе
оборудовании (марка и параметры жесткого диска, тип и частота процессора,
размер оперативной памяти, тип BIOS, характеристики и названия видео-, звуковой
и сетевой карт и пр.);
n данные протокола работы, имеющие отношение к
определенным событиям (запуск, остановка операционной системы, установка и
извлечение USB-устройства, установка и удаление программного обеспечения и
т. п.);
n параметры настройки компьютера (название
компьютера, рабочая группа, название ОС и дата установки, перечень загружаемых
ОС, список пользователей ОС, имя зарегистрировавшегося пользователя, время
последней загрузки и пр.).

Рисунок 7. Результаты
обработки свойств классов Win32_ComputerSystem, Win32_OperatingSystem и
Win32_UserAccount
Подводя итог изложению
возможностей VBScript для изучения компьютерной системы, следует остановиться
на ограничениях, отдельные из которых уже упоминались в статье.
n Полный набор возможностей VBScript может быть
задействован только в случае запуска программ для анализа на изучаемой системе.
n Невозможно достичь высокого быстродействия для
программ на VBScript.
n При наличии на исследуемом компьютере
нескольких операционных систем Windows или даже более одного рабочего
пользователя реализация решений с использованием скриптовых языков существенно
усложняется. А в случаях, когда на диске имеется раздел операционной системы Linux,
VBScript оказывается просто бесполезен.
n Запуск программ WSH, вообще говоря, влечет за
собой изменения на носителе изучаемого компьютера, что не всегда приемлемо, а
работа с образами в отдельных случаях может быть достаточно проблематичной.
n Для VBScript отсутствуют механизмы
восстановления на носителях удаленной информации (глубокий анализ подходов для
восстановления данных с носителей, обладающих различной файловой структурой,
скрупулезно был изложен Крисом Касперски в предыдущих номерах журнала за
2004-2005 гг.).
В качестве бонуса для заинтересованных читателей
автором подготовлен набор скриптов, в которых реализованы все возможности VBScript,
изложенные в статье (см. http://www.samag.ru
раздел «Исходный код»).