Книга: Недокументированные и малоизвестные возможности Windows XP

Включение и выключение SystemRestore для отдельных дисков

Включение и выключение SystemRestore для отдельных дисков

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

Листинг 11.1. Отключение или включение восстановления системы на отдельном диске

'Для работы данного сценария используются возможности объектов 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("HKLMSOFTWAREMicrosoftWindows NTCurrentVersionSystemRestoreDisableSR")
 'Если параметр, значение которого мы считываем, не существует в
 'реестре, тогда компилятор запишет в специальный объект err
 'код ошибки, равный –2147024894 (именно ошибка с этим кодом и возникает
 'в том случае, если параметр реестра, к которому мы пытаемся
 'получить доступ, в реестре отсутствует) .Если действительно произошла
 'ошибка с данным кодом, то SystemRestore на компьютере отключена,
 'то есть все попытки включения/отключения дисков, отличных от системного
 '(ниже под С: понимается системный диск), будут неудачны.
 'Ниже в сценарии будет присутствовать еще одно условие, выполняющее те же
 'действия, что и это. Работа с объектом для хранения ошибок была описана
 'лишь для примера, таккак в сценариях сервера сценариев Windows это
 'единственный способ определить, присутствует ли в реестре конкретный
 'параметр.
 if (err.Number = –2147024894) and (Drive <> "c:") then
  objTextFile.WriteLine " : Параметр DisableSR отсутствует в реестре. Это значит, что SystemRestore отключена и вкладка для ее настройки отсутствует в диалоге Свойства системы"
  'Выходим из функции, а поскольку эта функция главная, то завершается
  'и работа сценария. Иными словами, дальнейший код сценария
  'выполняться не будет, если мы пытаемся включить/отключить несистемный
  'диск, если сама возможность SystemRestore отключена.
  exit sub
 End if
 'Под диском C: понимается системный диск, поэтому если вашим системным
 'диском является не диск С:, то букву нужно заменить. Особенность
 'работы SystemRestore заключается в том, что в случае остановки
 'SystemRestore на системном диске SystemRestore автоматически
 'останавливается на всех дисках компьютера и параметр DisableSR становится
 'равен 1. Именно поэтому запросы на включение/выключение System Restore
 'на отличных от системного диска дисках не обрабатываются при значении
 'параметра 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 " : SystemRestore для диска " & Drive & " успешно остановлена"
   Else
    objTextFile.WriteLine " : Внимание!!! SystemRestore для диска " & Drive & " остановить не удалось"
   End If
  case "Y"
   If (obj.Enable(Drive)) = 0 Then
    objTextFile.WriteLine " : SystemRestore для диска " & Drive & " успешно запущена"
   Else
    objTextFile.WriteLine " : Внимание!!! SystemRestore для диска " & 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}!«имякомпьютера»rootdefault:SystemRestore")

При этом вместо имени компьютера можно использовать точку. В этом случае вы опять будете подключаться к локальному компьютеру.

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

? cscript d: sr.vbs — полностью отключить возможность восстановления системы (если диск C: является системным);

? cscript d:sr.vbs c: Y — полностью включить возможность восстановления системы (если диск C: является системным);

? cscript d:sr.vbs D: N — отключить SystemRestore только на диске D:.

Оглавление книги


Генерация: 1.396. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз