Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Секреты Windows: статьи о реестре, rundll32.exe, программах Недокументированные возможности Windows XP. MMC. Часть 4


Продолжение, начало в выпусках: 1 2 3

В конец записи

оцените: 1 2 3 4 5

Книга "Недокументированные возможности Windows XP. Библиотека пользователя", Глава 3. Консоль управления Microsoft. Часть 4. Оснастки Windows XP: Управляющий элемент WMI, начало

Оснастка УПРАВЛЯЮЩИЙ ЭЛЕМЕНТ WMI содержит в себе настройки инструментария управления Windows (WMI), с помощью которого можно удаленно или локально управлять различными настройками операционной системы Windows. WMI реализовано на основе протокола WBEM (протокол управления предприятием на основе веб-технологий) и включает в себя CIM-совместимую базу данных (CIMOM), содержащую в себе сведения об объектах системы, а также диспетчер CIM, с помощью которого реализованы функции работы с поставщиками WMI. Поставщики WMI являются посредниками между WMI и компонентами компьютера. Именно с их помощью реализуются такие возможности, как считывание, оповещение о событии и изменение данных состояния компонентов компьютера. Сама же возможность WMI может применяться как в программировании под Windows с помощью WinAPI, так и при создании скриптов сервера сценариев Windows. Также возможности WMI используются в компонентах СВОЙСТВА СИСТЕМЫ, СВЕДЕНИЯ О СИСТЕМЕ и для формирования вкладки ЗАВИСИМОСТИ диалога свойств конкретной службы в оснастке СЛУЖБЫ.

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

Свойства WMI

Для работы оснастки УПРАВЛЯЮЩИЙ ЭЛЕМЕНТ WMI необходимо, чтобы в системе был зарегистрирован GUID-номер {5C659257-E236-11D2-8899-00104B2AFB46}. Именно этот GUID-номер и идентифицирует настройки оснастки УПРАВЛЯЮЩИЙ ЭЛЕМЕНТ WMI. Данная оснастка входит в состав консоли ИНФРАСТУКТУРА УПРАВЛЕНИЯ WMI, открыть которую можно с помощью команды WMIMGMT.MSC. После ввода данной команды перед вами отобразится пустое окно консоли, содержащее единственный элемент дерева консоли — ЭЛЕМЕНТ УПРАВЛЕНИЯ WMI (ЛОКАЛЬНЫЙ). Контекстное меню данного элемента содержит в себе две основные команды: ПОДКЛЮЧЕНИЕ К ДРУГОМУ КОМПЬЮТЕРУ… и СВОЙСТВА. Первая из этих команд предназначена для просмотра WMI удаленного компьютера, а вторая команда позволяет просмотреть настройки WMI локального компьютера. После выбора команды СВОЙСТВА перед вами отобразится диалоговое окно, подобное приведенному на рисунке 3.21.

Рисунок 1 Рис. 3.21. Свойства WMI

На вкладке ОБЩИЕ диалога свойств отображается общая информация о компьютере к WMI которого вы подключились. Также с помощью данной вкладки можно изменить учетную запись, от имени которой вы выполнили подключение. Для этого предназначена кнопка ИЗМЕНИТЬ. На вкладке ВЕДЕНИЕ ЖУРНАЛА можно определить путь к журналам событий WMI, его размер, а также сведения, которые будут помещаться в эти журналы. На вкладке АРХИВИРОВАНИЕ И ВОССТАНОВЛЕНИЕ можно вручную выполнить такие операции, как архивирование или восстановление CIM-совместимой базы данных WMI. На вкладке ДОПОЛНИТЕЛЬНО можно определить пространство имен WMI, используемое по умолчанию при разработке сценариев (если конкретное пространство имен указано не было). На вкладке БЕЗОПАСНОСТЬ можно определить права доступа для различных пространств имен WMI. По умолчанию администраторы имеют полный доступ ко всему пространству имен, а остальным группам пользователей разрешен только доступ на выполнение методов пространства имен.

Если читатель знаком с программированием на языке С++, тогда ему известен термин ПРОСТРАНСТВО ИМЕН. Это логическое объединение различных функций, переменных, классов и т.д., направленное на улучшение структурированности кода и исключение конфликтов между функциями, имеющими одинаковые названия. В контексте WMI с помощью пространства имен реализована также и система безопасности. То есть, если пользователю запрещен доступ к одному из пространств имен, тогда он не сможет использовать функции, которые были описаны в этом пространстве имен.

Настройки WMI в реестре

В предыдущем разделе мы вкратце рассмотрели настройки WMI, которые можно изменить с помощью диалога СВОЙСТВА: ЭЛЕМЕНТ УПРАВЛЕНИЯ WMI (ЛОКАЛЬНЫЙ). Теперь же давайте рассмотрим настройки WMI, доступ к которым нам предоставляет реестр Windows XP. Все эти настройки содержатся в ветви реестра HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WBEM.

  • Build. Значение данного параметра строкового типа определяет номер версии WMI, установленной на системе. По умолчанию в Windows XP используется версия 2600.0000.
  • Installation Directory. Значение данного параметра строкового типа определяет путь к каталогу, хранящему в себе файлы WMI. В этом каталоге расположены все библиотеки, необходимые для работы WMI, файлы журналов и многое другое.
  • MOF Self-Install Directory. Значение данного параметра строкового типа определяет путь к каталогу, в который будут помещаться файлы с расширением .mof, предназначенные для автоматического добавления новых поставщиков WMI, а также функций и методов.

    Кроме параметров, данная ветвь реестра содержит в себе вложенный подраздел CIMOM, содержащий в себе сведения о CIM-совместимой базе данных WMI. Данный подраздел содержит в себе следующие параметры.

  • Autorecover MOFs. Данный параметр типа REG_MULTI_SZ содержит в себе список всех файлов с расширением .mof, используемых при инициализации и восстановлении базы данных WMI. Также содержимое данного файла определяет порядок, в котором компилировались файлы MOF при установке WMI.
  • Backup Interval Threshold. Значение данного параметра строкового типа определяет промежуток времени в минутах, после истечения которого будет выполняться резервное копирование базы данных WMI.
  • EnableEvents. Значение данного параметра строкового типа определяет, будет ли использоваться подсистема событий WMI. Если значение данного параметра равно 1, тогда использоваться будет. Как правило, значение данного параметра равно 0.
  • EnableStartupHeapPreallocation. Значение данного параметра DWORD-типа определяет, будет ли сразу же при запуске WMI выделяться куча (часть оперативной памяти, используемая для хранения объектов). Если значение данного параметра равно 1, тогда при запуске WMI будет заранее выделяться куча, размер которой определен в параметре LASTSTARTUPHEAPPREALLOCATION.
  • EnablePrivateObjectHeap. Значение данного параметра DWORD-типа определяет, будет ли использоваться куча для хранения объектов от поставщиков.
  • EnableObjectValidation. Если значение данного параметра DWORD-типа будет равно 1, тогда проверка целостности объектов от поставщиков будет выполняться.
  • High Threshold On Client Objects (b). Значение данного параметра DWORD-типа определяет верхнее пороговое значение очереди объектов от поставщиков, достижение которого приводит к прекращению приема объектов от поставщиков (в этом случае WMI возвращает поставщикам код WBEM_E_OUT_OF_MEMORY).
  • High Threshold On Events (b). Значение данного параметра DWORD-типа аналогично значению предыдущего, но в этом случае определяется верхнее пороговое значение очереди событий (а не объектов) от поставщиков.
  • Low Threshold On Client Objects (b). Значение данного параметра DWORD-типа определяет нижнее пороговое значение очереди объектов от поставщиков, достижение которого приводит к замедлению скорости создания объектов.
  • Low Threshold On Events (b). Значение данного параметра DWORD-типа определяет нижнее пороговое значение очереди событий от поставщиков, достижение которого приводит к замедлению скорости создания событий.
  • Logging Directory. Значение данного параметра строкового типа содержит в себе путь к каталогу, содержащему в себе файлы системных журналов WMI. Именно значение этого параметра и редактируется на вкладке ВЕДЕНИЕ ЖУРНАЛА.
  • Logging. Значение данного параметр строкового типа определяет уровень протоколирования ошибок и может принимать следующие значения: 0 — отключить протоколирование; 1 — краткое протоколирование ошибок; 2 — полное протоколирование ошибок.
  • Log File Max Size. Значение данного параметра определяет максимальный размер файлов журналов, создаваемых службами WMI.
  • Max DB Size. Значение данного параметра строкового типа определяет максимальный размер базы данных WMI.
  • Max Wait On Events (ms). Значение данного параметра строкового типа указывает время в миллисекундах, в течение которого событие может находиться в очереди. Если по истечении этого времени событие все еще находится в очереди, оно будет автоматически удалено.
  • Max Wait On Client Objects (ms). Значение данного параметра строкового типа указывает время в миллисекундах, в течение которого объект может находиться в очереди. Если по истечении этого времени объект все еще находится в очереди, он будет автоматически удален.
  • Repository Directory. Значение данного параметра строкового типа определяет путь к каталогу, используемому службой WMI для хранения архивов CIM-совместимой базы данных. Данные архивы используются при восстановлении базы данных.
  • Working Directory. Значение данного параметра строкового типа определяет путь к рабочему каталогу WMI. по умолчанию используется путь %systemroot%\system32\wbem.

Также в реестре существует ветвь HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WBEM\SCRIPTING. Значения данной ветви определяют настройки взаимодействия WMI и сервера сценариев Windows. Например, данная ветвь может содержать следующие параметры.

  • Default Namespace. Значение данного параметра строкового типа определяет пространство имен, используемое по умолчанию (если пространство имен не указано явно). Чаще всего значение этого параметра равно root\cimv2.
  • Enable for ASP. Если значение данного параметра DWORD-типа будет равно 1, тогда будет разрешено использование сценариев WMI для ASP.
  • Default Impersonation Level. Данный параметр типа DWORD определяет используемый по умолчанию (если уровень не указан в скрипте) уровень прав безопасности. По умолчанию значение данного параметра равно 3.
Доступ к WMI с помощью сервера сценариев

Полное понимание WMI невозможно без знания тех возможностей, которые она предоставляет администратору. Поэтому давайте рассмотрим сейчас некоторые примеры написания скриптов сервера сценариев Windows с использованием возможностей WMI. Данный раздел не описывает работу с сервером сценариев — предполагается, что вы уже знаете, что это такое, и как писать простые скрипты на языках VBScript или JScript. Просто, здесь будет дано несколько примеров скриптов, на основе которых можно представить, какие возможности открываются перед администратором при использовании WMI, а также будет дана ссылка на один интересный каталог файловой системы Windows, содержащий в себе список всех функций, реализованных в пространствах имен, и краткое описание этих функций.

Итак, сервер сценариев Windows является объектно-ориентированным языком. То есть, при написании скриптов, в них можно подключать различные объекты (содержащие в себе описания методов, реализующих различные возможности работы с операционной системой), а также моникеры (COM-механизм для обеспечения привязки к COM-объекту, например, к базе данных WMI). Скрипты сервера сценариев можно писать либо на языке VBScript, либо на языке Jscript. Мы же с вами для рассмотрения примеров воспользуемся языком VBScript.

Есть два способа запуска скриптов сервера сценариев Windows — либо с помощью двойного щелчка на файле (или с помощью команды wscript.exe), либо с помощью команды cscript.exe. Программа cscript.exe предназначена для работы со скриптом из командной строки и ее плюсом является возможность указания опций работы скрипта (если скрипт обрабатывает опции). Описанные ниже примеры, как правило, используют опции командной строки, поэтому для их использования лучше воспользоваться программой cscript.exe.

Включение и выключение SystemRestore для отдельных дисков Давайте рассмотрим первый пример тех возможностей, которые предоставляет администратору WMI. В этом примере мы воспользуемся классом SYSTEMRESTORE, описанным в пространстве имен ROOT/DEFAULT для реализации возможности отключения или включения восстановления системы на отдельных дисках с помощью сервера сценариев Windows. Данный пример, кроме доступа к WMI, по возможности будет содержать в себе реализацию основных возможностей объектов сервера сценариев, а также подробное объяснение, для чего мы записываем ту или иную строку скрипта.

Листинг 3.01. Отключение или включение восстановления системы на отдельном диске
'Для работы данного скрипта используются возможности объектов Windows 
'(работа с реестром и файловой системой) поэтому перед обращением к
'этим возможностям, нужно объявить в скрипте объекты, в которых они описаны
'Сейчас мы объявляем объект для работы с файловой системой Windows, он
'нам понадобится для возможности записи в файл сведений об отключении 'SystemRestore

set objFS = CreateObject("Scripting.FIleSystemObject")

'После объявления объекта, нам необходимо открыть текстовый файл
'(например, файл sr_log.txt, расположенный в каталоге d:\)
'для записи (если файл не сущестует, тогда он будет автоматически создан).
'В этот файл будет записываться информация о работе скрипта

set objTextFile = objFS.OpenTextFile("d:\sr_log.txt", 8, True)

'Теперь мы объявляем объект для работы с реестром Windows.
'Он нам понадобится для доступа к параметру, указывающему, включена ли 
'в данный момент возможность SystemRestore

set objREG = WScript.CreateObject("Wscript.Shell")

'Теперь мы объявляем объект, с помощью которого можно обработать
'передаваемые в скрипт опции командной строки. Наш скрипт будет 
'использовать опции командной строки для определения того, что же 
'ему нужно делать. При этом, полная строка запуска нашего скрипта
'будет выглядеть так: cscript «путь к файлу скрипта и его имя» «значок
'диска» «если эта опция равна Y, тогда SystemRestore на диске будет
'включена, если же значение этой опции равно N, тогда отключена».
'Если опции не заданы (например, скрипт запускается двойным щелчком на
'его значке), тогда будут применяться опции по умолчанию: будет 
'отключаться возможность SystemRestore на диске c:\.

Set Args = wscript.Arguments

'Теперь мы проверяем, использовали ли при запуске скрипта опцию значка диска
'(первую опцию). Если не использовали, тогда будет работать с диском c:\

If Args.Count() > 0 Then
    Drive = Args.item(0)
Else
    Drive = "c:\"
End If

'Теперь мы проверяем использование при запуске скрипта второй опции

If Args.Count() > 1 Then
    StopSR = Args.item(1)
Else
    StopSR = "N"
End If

'При каждом запуске даннного скрипта мы будем вести лог его работы.
'Каждый лог, как правило, начиенается с даты и времени, когда скрипт
'был запущен — именно эту информацию мы и добавляем в открытый ранее
'файл. Для этого мы используем метод Write, чтобы серевер сценариев 
'не переходил на следующую строчку лог-файла после занесения в него 
'даты и вермени

objTextFile.Write Date() & " в " & Time()

'Сейчас мы вызываем главную функцию программы, описанную ниже в скрипте.
'Главный код программы был реализован в виде функции, чтобы показать 
'читателю большинство возможностей сервера сценариев Windows

call sronoff()

'А вот и главная функция программы (которая будет называться sronoff).
'Именно эта функция отключает или включает SystemRestore на определенном
'диске. Реализация частей кода скрипта в виде функций позволяет использовать
'его возможности по максимуму. Например, такой подход позволяет завершать
'работу скрипта в любое время, не зависимо от оставшегося для 
'обработки кода, или использовать для каждой части кода свои 
'методы обработки ошибок.

private sub sronoff()

'ВНИМАНИЕ, ИМЕННО СЕЙЧАС МЫ ПОДКЛЮЧАЕМСЯ К WMI с помощью моникера winmgmts.
'Здесь мы подключаемя к пространству имен root/default локального компьютера
'и объвляем класс SystemRestore этого пространства c имитацией прав 
'доступа (impersonate). Если вам запрещен доступ к пространству 
'имен root/default, тогда вы не сможете объявить класс SystemRestore
'Помните, выше мы рассматривали параметры реестра, для определения порогов
'передачи объектов от поставщиков WMI. Именно передачей объектов мы и
'пользуемся в данный момент.

Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")

'Чуть ниже мы считываем с реестра значение параметра. Особенность 
'скриптов состоит в том, что скрипт будет выдавать ошибку, если параметра,
'значение которого мы считываем, не существует в реестре. Чтобы скрипт 
'не завершался ошибкой, мы подавляем возможность выдачи ошибок.
'То есть, приведенная ниже строка говорит серверу сценариев о том, что
'в случае возникновения ошибки он должен дальше обрабатывать скрипт,
'не обращая внимания на возникшую ошибку

ON ERROR RESUME NEXT

'Именно сейчас мы и работаем с реестром. Мы считываем значение
'параметра DisableSR. Если значение данного параметра равно 1,
'тогда SystemRestore полностью отключен на всех дисках и наш
'скрипт в любом случае не будет работать со всеми дисками,
'кроме системного

dasableSR = objREG.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore\DisableSR")

'Если параметр, значение которого мы считываем, не существует в
'реестре, тогда компилятор запишет в специальнуй объект err
'код ошибки, равный -2147024894 (именно ошибка с этим кодом и возникает
'в том случае, если параметр реестра, к которому мы пытаемся
'получить доступ, в реестре отстусвует). Если действительно произошла
'ошибка с данным кодом, тогда SystemRestore на компьютере отключена
'то есть, все попытки включения/отключения дисков, отличных от систменого
'(ниже под c:\ понимается системный диск) будут неудачны
'Ниже в скрипте будет присутсвавать еще одно устловие, выполняющее те же
'действия, что и это. Работа с объектом для хранения ошибок была описана
'лишь для примера, так как в скриптах сервера сценариев Windows это
'единственный способ определить, присутствует ли в реестре конкретный
'параметр

if (err.Number = -2147024894) and (Drive <> "c:\") then 
    objTextFile.WriteLine " : Параметр DisableSR отсутсвует в реестре. \
 Значит SystemRestore отключена и ее вкладка отсутствует в Свойства: Система"

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

exit sub
End if

'Под диском C:\ понимается системный диск, поэтому если вашим системным
'диском является не диск c:\, тогда букву нужно заменить. Особенность 
'работы SystemRestore заключается в том, что в случае остановки
'SystemRestore на системном диске, SystemRestore автоматически
'останавливается на всех дисках компьютера и параметр DisableSR становится
'равен 1. Именно поэтому запросы на включение/выключение SystemRestore
'на отличных от системного диска дисков не обрабатываются при значении
'параметра DisableSR, равном 1 (эти запросы работать не будут). При
'этом, системный диск запросы обрабатывать может — если SystemRestore на
'нем будет включена, тогда параметр DisableSR станет равным 0, а значит,
'будет включена и сама возмодность Автоматического восстановления.
'Именно поэтому ниже системный диск и исключается из условного выполнения.

if (dasableSR > 0) and (Drive <> "c:\") then 
    objTextFile.WriteLine " : Работа SystemRestore на всех дисках была отключена"
exit sub
else 

'Для облегчения читаемости приведенного кода вместо условных конструкций
'if...else используются конструкции select case. А в остальном, дальше 
'код довольно простой, поэтому описывать его мы не будем

select case StopSR
case "N"
If (obj.Disable(Drive)) = 0 Then
    objTextFile.WriteLine " : Для диска " & Drive & " успешно остановлена"
Else 
    objTextFile.WriteLine " : Для диска " & Drive & " остановить не удалось"
End If

case "Y"
If (obj.Enable(Drive)) = 0 Then
    objTextFile.WriteLine " : Для диска " & Drive & " успешно запущено"
Else 
    objTextFile.WriteLine " : Для диска " & Drive & " запустить не удалось"
End If
End Select
End if

'Считается хорошим тоном закрывать в скриптах текстовые файлы, открытые
'до этого. Именно этим и занимается приведенная ниже строка.

objTextFile.Close
end sub

Вот в принципе и все. Приведенный на листинге скрипт очень подробно описан, поэтому больше мы его описывать не будем. Для запуска данного скрипта необходимо иметь права администратора на локальном компьютере, иначе вы не сможете получить доступ к WMI. Если немножко изменить данный скрипт, тогда можно будет подключиться не к локальному компьютеру, а к любому другому компьютеру сети. Для этого нужно строчку Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore") земенить на строчку Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\«имя компьютера»\root\default:SystemRestore"). При этом вместо имени компьютера можно использовать точку. В этом случае вы опять будете подключаться к локальному компьютеру.

И напоследок несколько возможных команд запуска приведенного скрипта:

  • cscript d:\sr.vbs. Полностью отключить возможность восстановления системы (если диск c:\ является системным);
  • cscript d:\sr.vbs c:\ Y. Полностью включить возможность восстановления системы (если диск c:\ является системным);
  • cscript d:\sr.vbs D:\ N. Отключить SystemRestore только на диске D:\;

Продолжение следует

Оригинал статьи: http://www.onestyle.com.ua/txt.php?u=144

В избранное