Роман Клименко - Недокументированные и малоизвестные возможности 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, которое выполняет именно эту операцию.