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

Как узнать, что системе требуется перезагрузка после установки обновлений
Ранее я рассказывал, как можно отключить принудительную перезагрузку при установке обновлений 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, через метод которого можно узнать, требуется ли компьютеру перезагрузка. Как обычно, начинаем с описания интерфейсов и необходимых констант.
Code (Assembler) : Убрать нумерацию
- ; GUID {C01B9BA0-BEA7-41BA-B604-D0A36F469133}
- CLSID_SystemInformation \
- dd 0C01B9BA0h
- dw 0BEA7h
- dw 041BAh
- db 0B6h, 004h, 0D0h, 0A3h, 06Fh, 046h, 091h, 033h
- ; GUID {ADE87BF7-7B56-4275-8FAB-B9B0E591844B}
- IID_ISystemInformation \
- dd 0ADE87BF7h
- dw 07B56h
- dw 04275h
- db 08Fh, 0ABh, 0B9h, 0B0h, 0E5h, 091h, 084h, 04Bh
- ; IID_ISystemInformation Interface
- struct ISystemInformation
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; ISystemInformation
- GetTypeInfoCount dd ? ; 00Ch
- GetTypeInfo dd ? ; 010h
- GetIDsOfNames dd ? ; 014h
- _Invoke dd ? ; 018h
- get_OemHardwareSupportLink dd ? ; 01Ch
- get_RebootRequired dd ? ; 020h
- ends
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Создать объект
- invoke CoCreateInstance,CLSID_SystemInformation,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_ISystemInformation,pISiDisp
- cmp eax,S_OK
- jne loc_exit
- ; Требуется перезагрузка?
- mov eax, [pISiDisp]
- mov eax, [eax]
- stdcall dword [eax+ISystemInformation.get_RebootRequired],\
- [pISiDisp],is_reboot
- ; В переменной is_reboot полученный статус
- ; -1 = перезагрузка требуется
- ; 0 = перезагрузка не требуется
- ...
- ...
- ...
- ; Удалить объект
- invoke CoUninitialize
В приложении пример программы с исходным текстом, которая определяет, требуется ли системе перезагрузка после установки обновлений или нет.
Просмотров: 2549 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария
Пример программы с исходным текстом (FASM)

