Blog. Just Blog

Как узнать, что системе требуется перезагрузка после установки обновлений

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как узнать, что системе требуется перезагрузка после установки обновлений
Как узнать, что системе требуется перезагрузка после установки обновлений

Ранее я рассказывал, как можно отключить принудительную перезагрузку при установке обновлений Windows. Сегодня копнем немного глубже, а именно научимся программно определять, что система ожидает эту самую перезагрузку. Зачем это нужно? Например, такое состояние означает, что некоторые файлы из пакета обновлений установлены не до конца, а значит лучше не производить никаких рискованных действий типа массированных инсталляций.

Но перезагрузка системы требуется не только после установки обновлений. Вот для расширения кругозора табличка с далеко не полным списком условий состояния реестра, при выполнении любого из которых система Windows будет ожидать перезагрузки.

Ключ реестраУсловие
HKLM\SOFTWARE\Microsoft\UpdatesЗначение параметра UpdateExeVolatile отличается от 0
HKLM\SYSTEM\CurrentControlSet\Control\Session ManagerПараметр PendingFileRenameOperations существует
HKLM\SYSTEM\CurrentControlSet\Control\Session ManagerПараметр PendingFileRenameOperations2 существует
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequiredКлюч существует
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Services\PendingСуществует любой из вложенных GUID ключей
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReportingКлюч существует
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceПараметр DVDRebootSignal существует
HKLM\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPendingКлюч существует
HKLM\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootInProgressКлюч существует
HKLM\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\PackagesPendingКлюч существует
HKLM\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttemptsКлюч существует
HKLM\SYSTEM\CurrentControlSet\Services\NetlogonПараметр JoinDomain существует
HKLM\SYSTEM\CurrentControlSet\Services\NetlogonПараметр AvoidSpnSet существует
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName
Значения параметров ComputerName в этих ключах отличаются

Столь обширные ковыряния в реестре я оставлю на потом, меня интересует только ожидание перезагрузки после установки обновлений. В данном случае я предпочту воспользоваться программистскими методами. А помочь в этом может COM-объект SystemInformation, через метод которого можно узнать, требуется ли компьютеру перезагрузка. Как обычно, начинаем с описания интерфейсов и необходимых констант.
  1. ; GUID {C01B9BA0-BEA7-41BA-B604-D0A36F469133}
  2. CLSID_SystemInformation dd 0C01B9BA0h
  3.                    dw 0BEA7h
  4.                    dw 041BAh
  5.                    db 0B6h, 004h, 0D0h, 0A3h, 06Fh, 046h, 091h, 033h
  6.  
  7. ; GUID {ADE87BF7-7B56-4275-8FAB-B9B0E591844B}
  8. IID_ISystemInformationDispatch dd 0ADE87BF7h
  9.                    dw 07B56h
  10.                    dw 04275h
  11.                    db 08Fh, 0ABh, 0B9h, 0B0h, 0E5h, 091h, 084h, 04Bh
  12.  
  13. ; IID_ISystemInformation Interface
  14. struct ISystemInformationDispatch
  15.     QueryInterface          dd ?
  16.     AddRef                  dd ?
  17.     Release                 dd ?
  18.  
  19.     GetTypeInfoCount        dd ?
  20.     GetTypeInfo             dd ?
  21.     GetIDsOfNames           dd ?
  22.     _Invoke                 dd ?
  23.  
  24.     ; ISystemInformation
  25.     get_OemHardwareSupportLink dd ?
  26.     get_RebootRequired         dd ?
  27. ends
  28.  
  29. CLSCTX_INPROC_SERVER    = 1
  30. S_OK                    = 0
Ну а дальше обычная работа с COM-объектами, постоянные читатели блога все это видели уже не один раз. Создаем объект SystemInformation по определенным выше GUID и обращаемся через его интерфейс к методу get_RebootRequired, указав в качестве параметра переменную, в которую будет записано нужное нам значение.
  1.         ; Инициализировать COM-объект
  2.         invoke  CoInitialize,NULL
  3.         ; Создать объект
  4.         invoke  CoCreateInstance,CLSID_SystemInformation,NULL,\
  5.                 CLSCTX_INPROC_SERVER,\
  6.                 IID_ISystemInformationDispatch,pISiDisp
  7.         cmp     eax,S_OK
  8.         jne     loc_exit
  9.  
  10.         ; Требуется перезагрузка?
  11.         mov     eax, [pISiDisp]
  12.         mov     eax, [eax]
  13.         stdcall dword [eax+ISystemInformationDispatch.get_RebootRequired],\
  14.                 [pISiDisp],is_reboot
  15.         ; В переменной is_reboot полученный статус
  16.         ; -1 = перезагрузка требуется
  17.         ;  0 = перезагрузка не требуется
  18.         ...
  19.         ...
  20.         ...
  21.         ; Удалить объект
  22.         invoke  CoUninitialize
Если переменная содержит нулевое значение, то перезагрузка в настоящее время не требуется. Любое другое значение, а это скорее всего будет -1, означает, что система находится в промежуточном состоянии, ожидая перезагрузки.

В приложении пример программы с исходным текстом, которая определяет, требуется ли системе перезагрузка после установки обновлений или нет.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Is.Reboot.Required.Demo.zip (1,913 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1978 | Комментариев: 0

Метки: Assembler, COM
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0081 сек.) / Память: 4.5 Mb
Наверх