Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
VB 6Как узнать состояние службы Восстановление Системы?
Нет,нельзя - данный метод ограничен методами отключения службы и,если память не изменяет, версией ОС.
Соответственно опираясь на на данную запись реестра можно вляпаться в ложные данные.
Я имею ввиду - если отключение произведено не через параметр реестра,то в ряде случаев это тупо не произойдет.
А если применялся другой метод то и данного параметра мы не увидим.
Отсюда вывод - плохой ориентир.
+ параметр реестра просто отключает восстановление,а программное отключение так же обнуляет все имеющиеся точки.
Кирилл, посмотрел я на иностранных форумах. В основном все смотрят параметр RPSessionInterval. Если 1 - то включена, 0 - выключена.
А добраться туда можешь как через WMI, так и через реестр.
Вот код еще, может, будет интересно. Правда там по-другому проверка.
Вообщем, надо самому отключать и смотреть, что изменяется.
Дело в том, что если ты отключишь SR другим методом, то в реестре соответственно также изменится значение. Работа SR неразрывно связана с той веткой.
Речь конечно не идет о недокументированных M$ способах.
А как ещё отключено? Что по твоему происходит при штатном (например из панели управления) отключение/включение службы восстановления.
Меняется как раз указанный мной параметр реестра.
Я так и делал.
Первым делом,прежде чем тему создать.
sr параметр у меня например вообще отсутствует,но менялись значения,которые к этому не должны относиться!
так же и на других восьмерках.
ок,пройдемся по этому пути еще раз,проверим с доказательствами.
так что насчет отключения только реестром - просто никто никогда не проверял видимо))
Koza Nozdri, ну дык, по твоим же скринам значение RPSessionInterval меняется.
На счет скрина об ошибке включения SR, объясни как воспроизвести. Попробую у себя, может что и предложу.
Параметр это настройки,он не влияет на результат.
А воспроизвести просто,отключаем скриптом и пробуем создать точку.
Это было для того,что бы вы видели что предложенный в реестре метод не надежен.
Koza Nozdri, WinApi функции не пишутся под конкретный язык . Они общие для всех. Как всегда, объявляется декларация функции, необходимые структуры и производится сам вызов.
SRSetRestorePoint - создает контрольную точку. Это ты предлагаешь я бы сказал неформальный способ - попытка создать контрольную точку, чтобы понять работает служба или нет.
Все...придумал.
Три варианта блокирования восстановления системы,три параметра системы нужно проверять.
Вы знали что rstrui.exe поддерживает аргументы?
Кстати - указанный выше способ через реестр пригоден только для ХР.
Мозги на бекрень,многое надо переделывать,в код потом пробовать буду пихать...
Я не помню если честно)) Тема про авз ведь большая.
Но скажу честно - я по сети искал долго,ничего не нашел,может плохо искал,конечно.
Но,как я понял,данным вопросом либо никто не задавался либо не было решения.
Я вечером еще на разных ОС погоняю,в порядок записи приведу и расскажу,может даже забракуете)
Koza Nozdri, неплохо бы с разных осей экспортировать раздел реестра настроек SR в вариантах - с отключением и без. glax24, а какой именно параметр проверял?
Option Explicit
Const MAX_DESC As Long = 255
Private Type PRESTOREPOINTINFO
dwEventType As Long
dwRestorePtType As Long
llSequenceNumber As Currency
szDescription As String * MAX_DESC
End Type
Private Type PSTATEMGRSTATUS
nStatus As Long
llSequenceNumber As Currency
End Type
Const BEGIN_SYSTEM_CHANGE As Long = 100
Const END_SYSTEM_CHANGE As Long = 101
Const DEVICE_DRIVER_INSTALL As Long = 10
Const MANUALLY_CREATED As Long = 16
Const ERROR_SUCCESS As Long = 0
Const ERROR_BAD_ENVIRONMENT As Long = 10
Const ERROR_DISK_FULL As Long = 112
Const ERROR_INTERNAL_ERROR As Long = 1359
Const ERROR_INVALID_DATA As Long = 13
Const ERROR_SERVICE_DISABLED As Long = 1058
Const ERROR_TIMEOUT As Long = 1460
Private Declare Function SRSetRestorePoint Lib "SrClient.dll" Alias "SRSetRestorePointA" (pRestorePtSpec As PRESTOREPOINTINFO, pSMgrStatus As PSTATEMGRSTATUS) As Long
Private Sub Form_Load()
Dim pRestoreInfo As PRESTOREPOINTINFO
Dim pState As PSTATEMGRSTATUS
With pRestoreInfo
.dwEventType = BEGIN_SYSTEM_CHANGE
.dwRestorePtType = DEVICE_DRIVER_INSTALL 'or MANUALLY_CREATED (undocumented)
.szDescription = String$(MAX_DESC, vbNullChar)
Mid$(.szDescription, 1) = "SafeZone.cc - Run SFC /scannow"
End With
If SRSetRestorePoint(pRestoreInfo, pState) And pState.nStatus = ERROR_SUCCESS Then 'Success
'Release the sequence
pRestoreInfo.dwEventType = END_SYSTEM_CHANGE
pRestoreInfo.llSequenceNumber = pState.llSequenceNumber
Call SRSetRestorePoint(pRestoreInfo, pState)
If pState.nStatus = ERROR_SUCCESS Then Debug.Print "OK. Success with release the sequence."
Else
Select Case pState.nStatus
Case ERROR_BAD_ENVIRONMENT
Debug.Print "The function was called in safe mode."
Case ERROR_DISK_FULL
Debug.Print "System Restore is in standby mode because disk space is low."
Case ERROR_INTERNAL_ERROR
Debug.Print "An internal error occurred."
Case ERROR_INVALID_DATA
Debug.Print "The sequence number is invalid."
Case ERROR_SERVICE_DISABLED
Debug.Print "System Restore is disabled."
Case ERROR_TIMEOUT
Debug.Print "The call timed out due to a wait on a mutex for setting restore points."
Case Else
Debug.Print "Unknown error #" & pState.nStatus
End Select
Debug.Print "LastDllError #" & Err.LastDllError
End If
Unload Me
End Sub
Стас,а твой код сразу точку создает?
Тогда не подойдет,потому что мне нужно что бы проверялся статус для вывода информации,создание точки при этом будет очень некстати (человек меню выбрал что бы почитать для чего а ему хлоп и точку автоматом,или таблеткой запрос делаешь,или лог собираешь...)
Сейчас проверил один метод что нашел ан хр и 8.
Суть такова - в вин хр,как и предлагалось ранее,создается параметр DisableSR.
А в вин старше висты восстановление работает немного иначе - там фигурирует теневое копирование,распределение хранилища на дисках.
Если не через политики,а приведенным методом вырубить восстановление:
VB.NET / VBA:
Sub DisableSystemRestore()
Dim objWMIService, objItem, errResults
Print strDisableSystemRestore1
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default")
Set objItem = objWMIService.Get("SystemRestore")
errResults = objItem.Disable("")
If errResults = 0 Then
Print strDisableSystemRestore2
Else
Print strDisableSystemRestore3
End If
Set objItem = Nothing
Set objWMIService = Nothing
End Sub
То,соответственно,обнуляется и хранилище и потребность в нем.
(расположение хранилища и т.д.) - значит восстановление включено,максимум что может грозить - ограничение доступа через политики,но это проверяется легко через чтение соответствующего параметра!
Все,работает четко и правильно,быстро;а самое главное - можно такую конструкцию использовать где угодно - батники,командная строка,vbs,vb6 ... короче кому где надо.
Надо проверить на серверных ОС,варианта два- или так или эдак,все зависит от ос.
Сейчас еще пробую прикрутиться к данным службы теневого хранилища,но там пока некоторая сложность у меня,не хочется что бы люди ось себе повредили.
Ну и проблему запуска на хр еще не решил на основной программе.
SRSetRestorePoint - создает контрольную точку. Это ты предлагаешь я бы сказал неформальный способ - попытка создать контрольную точку, чтобы понять работает служба или нет.
Удаляются все точки.
Но только если отключаешь так,через политики не должно очищаться,за пояснение к коду спасибо,наверное его возьму,допишу так же отключение и откат на выбранную точку.