МИХАИЛ КОШКИН
Решаем нестандартные задачи с помощью стандартного Windows Scripting Host
Достаточно часто в администрировании приходится сталкиваться с разовыми задачами, программные решения для которых под рукой отсутствуют, а путешествие по Интернету не приносит требуемого результата. Для таких случаев в операционной системе 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 дополнительно могут быть получены все основные характеристики носителя:
- тип файловой системы носителя – fso.GetDrive(i.DriveLetter).FileSystem;
- серийный номер тома – Hex(fso.GetDrive(i.DriveLetter).SerialNumber);
- метка тома – fso.GetDrive(i.DriveLetter).VolumeName;
- общий размер диска – FormatNumber (fso.GetDrive(i.DriveLetter).TotalSize /1048576, 1) & " Мб");
- размер незанятого пространства диска – FormatNumber (fso.GetDrive(i.DriveLetter).FreeSpace /(1024*1024), 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, для этого требуется визуальный контроль содержимого. В файле могут обнаружиться такие данные, как:
- имя и полный путь к файлу с документом;
- адреса электронной почты или информация о веб-сервере;
- имена принтеров;
- текстовые фрагменты, удаленные из документа в некоторый момент до сохранения;
- текстовые фрагменты из других документов, не имеющих отношения к данному, попавшие в него из-за ошибок в 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_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion
|
ProductName
|
Название продукта*
|
CurrentVersion
|
Версия продукта**
|
ProductId
|
ID продукта*
|
CSDVersion
|
Обновление
|
RegisteredOwner
|
Имя пользователя (указанное при установке системы)*
|
RegisteredOrganization
|
Название организации (указанное при установке системы)*
|
SystemRoot
|
Каталог установки*
|
SourcePath
|
Источник установки
|
InstallDate
|
Дата установки
|
Данные об автоматическом входе пользователя в систему.
Ветвь HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon
|
AutoAdminLogon
|
Автоматический вход (значение 1)
|
DefaultUserName
|
Имя пользователя по умолчанию
|
DefaultDomainName
|
Название домена по умолчанию
|
Ветка HKEY_CURRENT_USEREnvironment
|
TEMP
|
Каталог временных файлов пользователя
|
Информация по переменным среды.
Ветвь HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment
|
TEMP
|
Каталог временных файлов системы
|
Windir
|
Каталог системных файлов
|
PATHEXT
|
Путь поиска
|
Размещение некоторых стандартных каталогов Windows.
Ветвь HKEY_CURRENT_USER SoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders
|
Local Settings
|
Каталог локальных настроек
|
Personal
|
Каталог «Мои документы»***
|
Recent
|
Каталог хранения lnk раздела «Документы» меню «Пуск»**
|
Startup
|
Каталог хранения lnk раздела «Автозагрузка»**
|
Настройки экранной заставки. Ветвь HKEY_CURRENT_USERControl PanelDesktop
|
SCRNSAVE.EXE
|
Включение заставки (указывает наличие значения ключа)
|
ScreenSaverIsSecure
|
Включение парольной защиты экрана (значение 1 и наличие заставки)
|
Примечание:
* ключи используются также в Win98 и WinME (название раздела «Windows NT» следует изменить на «Windows»);
** ключи применяются в WinME.
Таблица 4. Для Win98 и WinME используются отдельные ключи, располагающиеся в других ветвях
Значение
|
Пояснение
|
Настройки экранной заставки. Ветвь HKEY_CURRENT_USERControl PanelDesktop
|
ScreenSaveActive
|
Включение заставки (значение 1)
|
ScreenSaveUsePassword
|
Включение парольной защиты экрана (значение 1 и наличие заставки)
|
Ветвь HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion
|
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 получить:
- информацию об установленном в системе оборудовании (марка и параметры жесткого диска, тип и частота процессора, размер оперативной памяти, тип BIOS, характеристики и названия видео-, звуковой и сетевой карт и пр.);
- данные протокола работы, имеющие отношение к определенным событиям (запуск, остановка операционной системы, установка и извлечение USB-устройства, установка и удаление программного обеспечения и т. п.);
- параметры настройки компьютера (название компьютера, рабочая группа, название ОС и дата установки, перечень загружаемых ОС, список пользователей ОС, имя зарегистрировавшегося пользователя, время последней загрузки и пр.).
Рисунок 7. Результаты обработки свойств классов Win32_ComputerSystem, Win32_OperatingSystem и Win32_UserAccount
Подводя итог изложению возможностей VBScript для изучения компьютерной системы, следует остановиться на ограничениях, отдельные из которых уже упоминались в статье.
- Полный набор возможностей VBScript может быть задействован только в случае запуска программ для анализа на изучаемой системе.
- Невозможно достичь высокого быстродействия для программ на VBScript.
- При наличии на исследуемом компьютере нескольких операционных систем Windows или даже более одного рабочего пользователя реализация решений с использованием скриптовых языков существенно усложняется. А в случаях, когда на диске имеется раздел операционной системы Linux, VBScript оказывается просто бесполезен.
- Запуск программ WSH, вообще говоря, влечет за собой изменения на носителе изучаемого компьютера, что не всегда приемлемо, а работа с образами в отдельных случаях может быть достаточно проблематичной.
- Для VBScript отсутствуют механизмы восстановления на носителях удаленной информации (глубокий анализ подходов для восстановления данных с носителей, обладающих различной файловой структурой, скрупулезно был изложен Крисом Касперски в предыдущих номерах журнала за 2004-2005 гг.).
В качестве бонуса для заинтересованных читателей автором подготовлен набор скриптов, в которых реализованы все возможности VBScript, изложенные в статье (см. http://www.samag.ru раздел «Исходный код»).