VB 6 Как узнать состояние службы Восстановление Системы?

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
как проверить включено ли восстановление системы
например, через WMIC
Кстати, а просто в реестре проверить нельзя?

Код:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore]
"DisableSR"=dword:00000000
 
а просто в реестре проверить нельзя?
Нет,нельзя - данный метод ограничен методами отключения службы и,если память не изменяет, версией ОС.
Соответственно опираясь на на данную запись реестра можно вляпаться в ложные данные.

например, через WMIC
Вот тут и поближе))
Подскажешь функцию?
Я включаю,отключаю,создаю,работаю над выбором дисков где должно включаться.
А как статус проверить не догнал.
 
Koza Nozdri, а как ты ее создаешь (точку) ?
Примерно так же должно и проверять.
Нет,нельзя - данный метод ограничен методами отключения службы и,если память не изменяет, версией ОС.
Т.е. что ты имеешь в виду - в реестре цифра 0, а еще где-то отключена и служба и поэтому SR не будет работать?
 
.е. что ты имеешь в виду - в реестре цифра 0, а еще где-то отключена и служба и поэтому SR не будет работать?
Я имею ввиду - если отключение произведено не через параметр реестра,то в ряде случаев это тупо не произойдет.
А если применялся другой метод то и данного параметра мы не увидим.
Отсюда вывод - плохой ориентир.
+ параметр реестра просто отключает восстановление,а программное отключение так же обнуляет все имеющиеся точки.
а как ты ее создаешь (точку) ?
VB.NET / VBA:
Sub AddRestorePoint()

'Создаем точку восстановления,прога приглушена до завершения операции.
'=====================================================================


        Const Alpha = 450
        SetWindowLong hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED
        SetLayeredWindowAttributes hwnd, 0, Alpha, 2
        windetekt.Enabled = False
        Text1.FontBold = True
      
   Dim objWMIService, objItem, errResults
        Text1.Text = strCreateSystemRestorePoint1 & vbNewLine & "Ожидайте завершения операции..."
      
            
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default")
  
    Set objItem = objWMIService.Get("SystemRestore")
   
            errResults = objItem.CreateRestorePoint _
                ("Windows Error Detector", DEVICE_DRIVER_INSTALL, BEGIN_SYSTEM_CHANGE)
    If errResults = 0 Then
                Text1.Text = strCreateSystemRestorePoint2
    Else
                Text1.Text = strCreateSystemRestorePoint3
    End If
      
        Set objItem = Nothing
    Set objWMIService = Nothing
  

        windetekt.Enabled = True
        SetWindowLong hwnd, GWL_EXSTYLE, 0
        Text1.Text = "Контрольная точка успешно создана!"
        Text1.FontBold = False
  
End Sub
.
("Windows Error Detector", DEVICE_DRIVER_INSTALL, BEGIN_SYSTEM_CHANGE)
Сюда я еще события и тип точки воткну,но думаю это не важно.
 
Последнее редактирование:
Кирилл, посмотрел я на иностранных форумах. В основном все смотрят параметр RPSessionInterval. Если 1 - то включена, 0 - выключена.
А добраться туда можешь как через WMI, так и через реестр.

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

Ну и возможно тебе понадобится способ включить SR: https://msdn.microsoft.com/en-us/library/windows/desktop/aa378858(v=vs.85).aspx
Кстати, я когда первый раз создавал точку твоим кодом, то она не создалась.
Так что я бы для перестраховки проверял успех операции вот этим методом.
Я имею ввиду - если отключение произведено не через параметр реестра,то в ряде случаев это тупо не произойдет.
Дело в том, что если ты отключишь SR другим методом, то в реестре соответственно также изменится значение. Работа SR неразрывно связана с той веткой.
Речь конечно не идет о недокументированных M$ способах.
 
Последнее редактирование:
Я имею ввиду - если отключение произведено не через параметр реестра
А как ещё отключено? Что по твоему происходит при штатном (например из панели управления) отключение/включение службы восстановления.
Меняется как раз указанный мной параметр реестра.
 
Вообщем, надо самому отключать и смотреть, что изменяется.
Я так и делал.
Первым делом,прежде чем тему создать.

sr параметр у меня например вообще отсутствует,но менялись значения,которые к этому не должны относиться!
так же и на других восьмерках.
ок,пройдемся по этому пути еще раз,проверим с доказательствами.
так что насчет отключения только реестром - просто никто никогда не проверял видимо))

я когда первый раз создавал точку твоим кодом, то она не создалась.
хм...посмотрю.
А как ещё отключено? Что по твоему происходит при штатн...
...Меняется как раз указанный мной параметр реестра..
сделаю вам скринов,поверите?
upload_2015-7-28_6-45-26.png


upload_2015-7-28_6-46-16.png

далее обновляем редактор реестра и вуаля
upload_2015-7-28_6-47-45.png

upload_2015-7-28_6-48-38.png
 
Koza Nozdri, ну дык, по твоим же скринам значение RPSessionInterval меняется.
На счет скрина об ошибке включения SR, объясни как воспроизвести. Попробую у себя, может что и предложу.
 
Параметр это настройки,он не влияет на результат.
А воспроизвести просто,отключаем скриптом и пробуем создать точку.
Это было для того,что бы вы видели что предложенный в реестре метод не надежен.
 
Последнее редактирование:
В общем узнать состояние службы корректно,как я понял,можно через функцию SRSetRestorePoint , но это для c++ ... их как то можно совмещать или тупик?
 
Koza Nozdri, WinApi функции не пишутся под конкретный язык :). Они общие для всех. Как всегда, объявляется декларация функции, необходимые структуры и производится сам вызов.
SRSetRestorePoint - создает контрольную точку. Это ты предлагаешь я бы сказал неформальный способ - попытка создать контрольную точку, чтобы понять работает служба или нет.
 
Все...придумал.
Три варианта блокирования восстановления системы,три параметра системы нужно проверять.
Вы знали что rstrui.exe поддерживает аргументы?
Кстати - указанный выше способ через реестр пригоден только для ХР.
Мозги на бекрень,многое надо переделывать,в код потом пробовать буду пихать...
 
в авз по моему этот баг так и не исправили.
Я не помню если честно)) Тема про авз ведь большая.
Но скажу честно - я по сети искал долго,ничего не нашел,может плохо искал,конечно.
Но,как я понял,данным вопросом либо никто не задавался либо не было решения.
Я вечером еще на разных ОС погоняю,в порядок записи приведу и расскажу,может даже забракуете)
 
Koza Nozdri, неплохо бы с разных осей экспортировать раздел реестра настроек SR в вариантах - с отключением и без.
glax24, а какой именно параметр проверял?

можно через функцию SRSetRestorePoint
Через нее будет вот так:
VB.NET / VBA:
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
Только учти, что в MDSN написано, что
Minimum supported server - None supported
т.е. я не уверен, что это вообще будет работать на серверных ОС.
Кстати, я когда первый раз создавал точку твоим кодом, то она не создалась.
С этим разобрался. В rstrui не сразу становится видна созданная точка, а только через секунд 10-15.
 
Стас,а твой код сразу точку создает?
Тогда не подойдет,потому что мне нужно что бы проверялся статус для вывода информации,создание точки при этом будет очень некстати (человек меню выбрал что бы почитать для чего а ему хлоп и точку автоматом,или таблеткой запрос делаешь,или лог собираешь...)

Сейчас проверил один метод что нашел ан хр и 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

То,соответственно,обнуляется и хранилище и потребность в нем.

Поэтому - тупо смотрим на наличие в
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SPP\Clients
требуемых данных и все,так вот просто.

Если мы там наблюдаем конфигурационную запись типа
Код:
\\?\Volume{a23e3006-0d89-11e3-9fe4-806e6f6e6963}\:(C%3A)
(расположение хранилища и т.д.) - значит восстановление включено,максимум что может грозить - ограничение доступа через политики,но это проверяется легко через чтение соответствующего параметра!

Все,работает четко и правильно,быстро;а самое главное - можно такую конструкцию использовать где угодно - батники,командная строка,vbs,vb6 ... короче кому где надо.

Надо проверить на серверных ОС,варианта два- или так или эдак,все зависит от ос.

Сейчас еще пробую прикрутиться к данным службы теневого хранилища,но там пока некоторая сложность у меня,не хочется что бы люди ось себе повредили.
Ну и проблему запуска на хр еще не решил на основной программе.
 
Стас,а твой код сразу точку создает?
Кирилл, я же тебе все объяснял в предыдущем посте:
SRSetRestorePoint - создает контрольную точку. Это ты предлагаешь я бы сказал неформальный способ - попытка создать контрольную точку, чтобы понять работает служба или нет.
Зато как код для создания точек очень хорош, потому что ты можешь получить описание любой ошибки, которая может произойти во время создания КТ.
То,соответственно,обнуляется и хранилище и потребность в нем.
Отключаешь SR, и очищается теневое хранилище? Хм... интересно.
 
Последнее редактирование:
Удаляются все точки.
Но только если отключаешь так,через политики не должно очищаться,за пояснение к коду спасибо,наверное его возьму,допишу так же отключение и откат на выбранную точку.
 
Последнее редактирование:
Назад
Сверху Снизу