Что нового

Служба Восстановления (system restore)- запуск+настройка наблюдения+vbs2autoit

saavaage

Знающий
Сообщения
171
Репутация
17
Есть следующая задача:
1. необходимо запустить службу восстановления (состояние - отключено, тип запуска - отключено)
2. необходимо включить наблюдение только за системным разделом (остальные отрубить)

Собственно, что есть:

1. код включения и запуска наблюдения за всеми разделами:

Код:
;~ ; Enable System Restore
$strComputer = @ComputerName
$objWmi = ObjGet("winmgmts://" & $strComputer & "/root/default:SystemRestore")
$objWmi.Enable("")
2. код на vbs отключения наблюдения на всех, кроме системного:

Код:
Set wshShell = CreateObject("WScript.Shell")
Set wshEnv = wshShell.Environment("Process")
strSysDrive = wshEnv("SYSTEMDRIVE")

strComputer = "."
Set objSR = GetObject("winmgmts:\\" & strComputer & "\root\default").Get("SystemRestore")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

For Each objDisk In objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
  If objDisk.DeviceID <> strSysDrive Then objSR.Disable objDisk.DeviceID & "\"
Next

Может кто-нибудь силен в vbs и поможет перегнать код №2 на autoit?



Добавлено:
Сообщение автоматически объединено:



Добавлено:
Сообщение автоматически объединено:

методом "научного тыка" получил такой вот код№2:

Код:
; Enable control drive "C"
$wshShell = ObjCreate("WScript.Shell")
$wshEnv = $wshShell.Environment("Process")
$strSysDrive = $wshEnv("SYSTEMDRIVE")

$strComputer = @ComputerName
$objSR = ObjGet("winmgmts://" & $strComputer & "/root/default:SystemRestore")
$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!//" & $strComputer & "/root/cimv2")

For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
  If $objDisk.DeviceID <> $strSysDrive Then
   $objSR.Disable($objDisk.DeviceID & "\")
  Endif
Next

ИТОГО объединил их в 1 и получил:

Код:
$strComputer = @ComputerName
$objSR = ObjGet("winmgmts://" & $strComputer & "/root/default:SystemRestore")

$wshShell = ObjCreate("WScript.Shell")
$wshEnv = $wshShell.Environment("Process")
$strSysDrive = $wshEnv("SYSTEMDRIVE")
$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!//" & $strComputer & "/root/cimv2")

; Enable System Restore
$objSR.Enable("")

sleep(2000)

; Enable control drive "C"
For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
  If $objDisk.DeviceID <> $strSysDrive Then
   $objSR.Disable($objDisk.DeviceID & "\")
  Endif
Next

Вроде работает, но только со второй попытки (1 попытка - запускается служба, 2-ая - отрубаются все, кроме системного

Просьба к знающим vbs - посмотрите что я сделал не так....
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: Служба Восстановления (system restore) - запуск + наблюдение за системным раздел

попробуй так
Код:
$wshShell = ObjCreate("WScript.Shell")
$wshEnv = $wshShell.Environment("Process")
$strSysDrive = $wshEnv("SYSTEMDRIVE")

$strComputer = "."
$objSR = ObjGet("winmgmts:\\" & $strComputer & "\root\default")
$objSR = $objSR.Get("SystemRestore")

$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
  If $objDisk.DeviceID <> $strSysDrive Then $objSR.Disable($objDisk.DeviceID & "\")
Next
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Re: Служба Восстановления (system restore) - запуск + наблюдение за системным раздел

Kaster, твой вариант тоже не сработал.

У меня сложилось впечатление, что мой и твой варианты не отрабатывают с 1 раза, т.к. служба запускается слишком медленно и 2 блок с настройками наблюдения за разделами уже успевает отработать (вхолостую, естесственно)..

На всякий случай выкладываю твой вариант + запуск самой службы:

Код:
$wshShell = ObjCreate("WScript.Shell")
$wshEnv = $wshShell.Environment("Process")
$strSysDrive = $wshEnv("SYSTEMDRIVE")

$strComputer = "."
$objSR = ObjGet("winmgmts:\\" & $strComputer & "\root\default")
$objSR = $objSR.Get("SystemRestore")

$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

; Enable System Restore
$objSR.Enable("")
; Enable control SYSTEM drive
For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
  If $objDisk.DeviceID <> $strSysDrive Then $objSR.Disable($objDisk.DeviceID & "\")
Next





Добавлено:
Сообщение автоматически объединено:

Работает через раз (один раз - срабатывает сразу, второй - приходится прогонять повторно)... Не понимаю, в чем затык.... :wacko:
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Re: Служба Восстановления (system restore) - запуск + наблюдение за системным раздел

Мда... как два разных скрипта, запущенных один за другим, они отрабатывают на ура:

Скрипт1
Код:
$strComputer = "."
  $objSR = ObjGet("winmgmts://" & $strComputer & "/root/default:SystemRestore")
  $objSR.Enable("")


Скрипт2
Код:
$wshShell = ObjCreate("WScript.Shell")
  $wshEnv = $wshShell.Environment("Process")
  $strSysDrive = $wshEnv("SYSTEMDRIVE")

  $strComputer = "."
  $objSR = ObjGet("winmgmts:\\" & $strComputer & "\root\default")
  $objSR = $objSR.Get("SystemRestore")

  $objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

  For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
      If $objDisk.DeviceID <> $strSysDrive Then $objSR.Disable($objDisk.DeviceID & "\")
	  sleep(10)
  Next


В составе одного скрипта, как 2 функции - приходится прогонять дважды, чтобы еще сработали настройки наблюдения за системным разделом :

Код:
_StartRestore()

_Control_System_Dr()

Func _StartRestore(); Enable System Restore
  $strComputer = "."
  $objSR = ObjGet("winmgmts://" & $strComputer & "/root/default:SystemRestore")
  $objSR.Enable("")
EndFunc

Func _Control_System_Dr(); Enable control SYSTEM drive
  $wshShell = ObjCreate("WScript.Shell")
  $wshEnv = $wshShell.Environment("Process")
  $strSysDrive = $wshEnv("SYSTEMDRIVE")

  $strComputer = "."
  $objSR = ObjGet("winmgmts:\\" & $strComputer & "\root\default")
  $objSR = $objSR.Get("SystemRestore")

  $objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

  For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
      If $objDisk.DeviceID <> $strSysDrive Then $objSR.Disable($objDisk.DeviceID & "\")
	  sleep(10)
  Next

EndFunc


В чем дело???
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 574
Репутация
335
Re: Служба Восстановления (system restore) - запуск + наблюдение за системным раздел

Может просто сделать задержку? Ибо служба включается не в доли секунды...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Re: Служба Восстановления (system restore) - запуск + наблюдение за системным раздел

Итак, как оказалось Medic84 был абсолютно прав, для решения этого бага необходимо было ввести значительный временной интервал.
Дело в том, что если RestoreService не была запущена, то при ее активации происходит автоматическое создание системной точки восстановления (на что уходит довольно много времени) и только потом можно выполнять любые другие задачи пользователя (настройка наблюдения за системным разделом, создание своей точки восстановления и т.д.)

Вообщем, вот рабочее решение этого вопроса (вместе с проверкой на существование службы)

Код:
#include <Constants.au3>


Global $sLogSR
Global $DebugMode = 0

IF _ServiceExists('srservice') = 1 Then
	 ; проверка на состояние службы (запущена или нет)
	  $hSR = Run('sc query Srservice', '', @SW_HIDE, $STDOUT_CHILD)
        While 1
          $sLogSR &= StdoutRead($hSR)
	      If @error Then ExitLoop
          Sleep(10)
        WEnd
       ; фильтрация статусной информации о службе
       $sLogSR1 = StringRegExpReplace($sLogSR, "(?si).*STATE\D*(\d+).*", '\1')

       IF $sLogSR1 = 4 Then ; 4 - запущена, 1 - нет
		   RunWait(@COMSPEC & ' /c WMIC /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint "Restore_Point_SmartXP", 100, 12', '', @SW_HIDE) ; запуск создания точки восстановления
	   Else
		   _StartRestore() ; старт службы
		   sleep(20000)    ; время, необходимое на запуск и создание системной точки восстановления
		   _Control_System_Dr() ; настройка слежения только за системным разделом
		   sleep(5000)          ;  время, необходимое для настройки (взял с гаком)
		   RunWait(@COMSPEC & ' /c WMIC /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint "Restore_Point_SmartXP", 100, 12', '', @SW_HIDE)  ; запуск создания точки восстановления
	   Endif
	   sleep(1000)
	   MsgBox(0, 'Сообщение о создании', 'Внимание! Точка восстановления успешно создана!', 4)
Else
	   MsgBox(0, '', 'Служба в системе не существует!')
EndIf

Func _StartRestore(); Enable System Restore
  $strComputer = "."
  $objSR = ObjGet("winmgmts://" & $strComputer & "/root/default:SystemRestore")
  $objSR.Enable("")
EndFunc

Func _Control_System_Dr(); Enable control SYSTEM drive
  $wshShell = ObjCreate("WScript.Shell")
  $wshEnv = $wshShell.Environment("Process")
  $strSysDrive = $wshEnv("SYSTEMDRIVE")

  $strComputer = "."
  $objSR = ObjGet("winmgmts:\\" & $strComputer & "\root\default")
  $objSR = $objSR.Get("SystemRestore")

  $objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

  For $objDisk In $objWMIService.ExecQuery("Select DeviceID From Win32_LogicalDisk Where DriveType = 3")
      If $objDisk.DeviceID <> $strSysDrive Then $objSR.Disable($objDisk.DeviceID & "\")
	  sleep(10)
  Next
EndFunc


Func _ServiceExists($nService)
	Local $objWMIService			; Main object
	Local $objQueryCollection		; Result of query
	Local $hObj						; Current selected Object in $objQueryCollection

	If $DebugMode = 1 Then ConsoleWrite(@CR)
	If $DebugMode = 1 Then ConsoleWrite("_ServiceExists($nService)" & @CR)
	If $DebugMode = 1 Then ConsoleWrite("_ServiceExists($nService)=  " & $nService & @CR)

	$objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")

	If IsObj($objWMIService) Then
		If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
		$objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")
	Else
		Return 110
	EndIf

	If IsObj($objQueryCollection) then
		If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

		For $hObj In $objQueryCollection
			If $hObj.Name = $nService Then Return 1		;Service found, return 1
		Next 											;<== $objWMIService In $hObj
	Else
		Return 110										;Obj error
	EndIf

	Return 0												;Service not found, return 0

EndFunc
 
Верх