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

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем Kиpилл, 26 июл 2015.

  1. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
  2. regist
    Оффлайн

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    например, через WMIC
    --- Объединённое сообщение, 26 июл 2015 ---
    Кстати, а просто в реестре проверить нельзя?

    Код (Microsoft Registry):
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore]
    "DisableSR"=dword:00000000
     
    Kиpилл и Dragokas нравится это.
  3. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Нет,нельзя - данный метод ограничен методами отключения службы и,если память не изменяет, версией ОС.
    Соответственно опираясь на на данную запись реестра можно вляпаться в ложные данные.

    Вот тут и поближе))
    Подскажешь функцию?
    Я включаю,отключаю,создаю,работаю над выбором дисков где должно включаться.
    А как статус проверить не догнал.
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Koza Nozdri, а как ты ее создаешь (точку) ?
    Примерно так же должно и проверять.
    Т.е. что ты имеешь в виду - в реестре цифра 0, а еще где-то отключена и служба и поэтому SR не будет работать?
     
  5. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Я имею ввиду - если отключение произведено не через параметр реестра,то в ряде случаев это тупо не произойдет.
    А если применялся другой метод то и данного параметра мы не увидим.
    Отсюда вывод - плохой ориентир.
    + параметр реестра просто отключает восстановление,а программное отключение так же обнуляет все имеющиеся точки.
    Код (vb.net):
    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


     
     
     
    .
    --- Объединённое сообщение, 27 июл 2015 ---
    ("Windows Error Detector", DEVICE_DRIVER_INSTALL, BEGIN_SYSTEM_CHANGE)
    Сюда я еще события и тип точки воткну,но думаю это не важно.
     
    Последнее редактирование: 27 июл 2015
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Кирилл, посмотрел я на иностранных форумах. В основном все смотрят параметр RPSessionInterval. Если 1 - то включена, 0 - выключена.
    А добраться туда можешь как через WMI, так и через реестр.

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

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

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.382
    Симпатии:
    5.268
    А как ещё отключено? Что по твоему происходит при штатном (например из панели управления) отключение/включение службы восстановления.
    Меняется как раз указанный мной параметр реестра.
     
  8. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Я так и делал.
    Первым делом,прежде чем тему создать.

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

    хм...посмотрю.
    сделаю вам скринов,поверите?
    --- Объединённое сообщение, 28 июл 2015 ---
    upload_2015-7-28_6-45-26.png

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

    далее обновляем редактор реестра и вуаля
    upload_2015-7-28_6-47-45.png
    --- Объединённое сообщение, 28 июл 2015 ---
    upload_2015-7-28_6-48-38.png
     
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Koza Nozdri, ну дык, по твоим же скринам значение RPSessionInterval меняется.
    --- Объединённое сообщение, 28 июл 2015 ---
    На счет скрина об ошибке включения SR, объясни как воспроизвести. Попробую у себя, может что и предложу.
     
  10. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Параметр это настройки,он не влияет на результат.
    А воспроизвести просто,отключаем скриптом и пробуем создать точку.
    Это было для того,что бы вы видели что предложенный в реестре метод не надежен.
     
    Последнее редактирование: 2 авг 2015
  11. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    В общем узнать состояние службы корректно,как я понял,можно через функцию SRSetRestorePoint , но это для c++ ... их как то можно совмещать или тупик?
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Koza Nozdri, WinApi функции не пишутся под конкретный язык :). Они общие для всех. Как всегда, объявляется декларация функции, необходимые структуры и производится сам вызов.
    SRSetRestorePoint - создает контрольную точку. Это ты предлагаешь я бы сказал неформальный способ - попытка создать контрольную точку, чтобы понять работает служба или нет.
     
  13. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Все...придумал.
    Три варианта блокирования восстановления системы,три параметра системы нужно проверять.
    Вы знали что rstrui.exe поддерживает аргументы?
    Кстати - указанный выше способ через реестр пригоден только для ХР.
    Мозги на бекрень,многое надо переделывать,в код потом пробовать буду пихать...
     
  14. glax24
    Оффлайн

    glax24 Разработчик

    Сообщения:
    2.000
    Симпатии:
    1.450
    Koza Nozdri, про востановление что это работает только на хр, я писал в теме по авз, в авз по моему этот баг так и не исправили.
     
    Kиpилл нравится это.
  15. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Я не помню если честно)) Тема про авз ведь большая.
    Но скажу честно - я по сети искал долго,ничего не нашел,может плохо искал,конечно.
    Но,как я понял,данным вопросом либо никто не задавался либо не было решения.
    Я вечером еще на разных ОС погоняю,в порядок записи приведу и расскажу,может даже забракуете)
     
  16. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Koza Nozdri, неплохо бы с разных осей экспортировать раздел реестра настроек SR в вариантах - с отключением и без.
    glax24, а какой именно параметр проверял?

    Через нее будет вот так:
    Код (vb.net):
    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 написано, что
    т.е. я не уверен, что это вообще будет работать на серверных ОС.
    --- Объединённое сообщение, 2 авг 2015, Дата первоначального сообщения: 2 авг 2015 ---
    С этим разобрался. В rstrui не сразу становится видна созданная точка, а только через секунд 10-15.
     
  17. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Стас,а твой код сразу точку создает?
    Тогда не подойдет,потому что мне нужно что бы проверялся статус для вывода информации,создание точки при этом будет очень некстати (человек меню выбрал что бы почитать для чего а ему хлоп и точку автоматом,или таблеткой запрос делаешь,или лог собираешь...)

    Сейчас проверил один метод что нашел ан хр и 8.

    Суть такова - в вин хр,как и предлагалось ранее,создается параметр DisableSR.

    А в вин старше висты восстановление работает немного иначе - там фигурирует теневое копирование,распределение хранилища на дисках.
    Если не через политики,а приведенным методом вырубить восстановление:
    Код (vb.net):
    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
    То,соответственно,обнуляется и хранилище и потребность в нем.

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

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

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

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

    Сейчас еще пробую прикрутиться к данным службы теневого хранилища,но там пока некоторая сложность у меня,не хочется что бы люди ось себе повредили.
    Ну и проблему запуска на хр еще не решил на основной программе.
     
  18. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Кирилл, я же тебе все объяснял в предыдущем посте:
    Зато как код для создания точек очень хорош, потому что ты можешь получить описание любой ошибки, которая может произойти во время создания КТ.
    Отключаешь SR, и очищается теневое хранилище? Хм... интересно.
     
    Последнее редактирование: 2 авг 2015
    Kиpилл нравится это.
  19. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.219
    Симпатии:
    4.978
    Удаляются все точки.
    Но только если отключаешь так,через политики не должно очищаться,за пояснение к коду спасибо,наверное его возьму,допишу так же отключение и откат на выбранную точку.
     
    Последнее редактирование: 2 авг 2015
    Dragokas нравится это.
  20. glax24
    Оффлайн

    glax24 Разработчик

    Сообщения:
    2.000
    Симпатии:
    1.450
    Вот тема
    И где то писал Олегу какой параметр в реестре меняется на 7.
     
    Kиpилл нравится это.

Поделиться этой страницей