KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программное обеспечение » Роман Клименко - Недокументированные и малоизвестные возможности Windows XP

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Роман Клименко, "Недокументированные и малоизвестные возможности Windows XP" бесплатно, без регистрации.
Перейти на страницу:

'оставшегося для обработки кода, или использовать для каждой части

'кода свои методы обработки ошибок.

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:.

Создание контрольной точки восстановления

Продолжим рассмотрение темы восстановления системы и опишем код для автоматического создания точки восстановления. На этот раз будет приведена только часть кода, отвечающая за работу WMI, а не весь код сценария, то есть обращение к моникеру winmgmts и работа с классом. Вы самостоятельно можете модифицировать приведенный выше код для того, чтобы он мог, например, автоматически включать работу SystemRestore, если возможность восстановления системы отключена, а потом уже выполнять создание контрольной точки восстановления.

Листинг 11.2 Создание контрольной точки восстановления

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

'С помощью данной функции и создается точка восстановления.

'Функция имеет три параметра, первый из которых определяет описание

'создаваемой точки восстановления и возвращает код ошибки в случае

'неудачной попытки создания. Нам этот код не нужен,

'но тем не менее его необходимо поместить в любую переменную.

'Если вы будете записывать сведения о создании точки в журнал,

'то данный код может понадобиться.

ErrorSRCode = obj.CreateRestorePoint("Точка восстановления от " & Time(), 0, 100)

Энумерация содержимого ветви реестра

Стандартные методы объекта, предназначенные для доступа к системному реестру (WScript.CreateObject("Wscript.Shell") ), один из которых, позволяющий считывать значения параметров из реестра, был рассмотрен в примере сценария для включения/отключения восстановления системы на логических дисках компьютера, позволяют выполнить базовые операции с реестром.

Но данный объект имеет один очень большой недостаток — с его помощью нельзя перечислить все параметры, расположенные в определенной ветви реестра. Этот недостаток ограничивал возможности применения сценариев сервера сценариев Windows, поэтому просто нельзя не рассказать о новом свойстве инструментария Windows, которое выполняет именно эту операцию.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*