Как проверить, нуждается ли сервер в перезагрузке

Как я могу проверить, нуждается ли сервер Windows в перезагрузке? Я делаю проект установщика. Когда пользователь запускает этот установщик, он не должен продолжать работу, если в операционной системе ожидается перезагрузка.


person Subhash Makkena    schedule 24.04.2017    source источник


Ответы (1)


Использование PowerShell

Если вы пытаетесь определить, какие из ваших серверов требуют перезагрузки, вам понравится этот скрипт PowerShell для проверки состояния. Оказывается, простой способ определить серверы, ожидающие перезагрузки, — это проверить реестр. Эта информация хранится в кусте реестра HKeyLocalMachine. PowerShell создан для работы с реестром. Реестр является одним из встроенных поставщиков PowerShell. К этому кусту реестра уже подключен PSDrive! Вы можете просматривать реестр так же, как и файловую систему.

Перейдите на диск реестра.

// Set-Location также можно вызывать через его псевдонимы — CD и SL

Установить расположение HKLM:

// Get-ChildItem также можно вызывать через его псевдонимы — Dir и LS

Get-ChildItem

Ух ты! Супер легко, правда? Теперь вам просто нужно знать, где находится «ожидающая перезагрузка». Есть пара мест для проверки.

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired Здесь исправления, установленные с помощью автоматических обновлений, регистрируют необходимость перезагрузки.

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending — еще одно место, где можно определить ожидающие перезагрузки.

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager — еще один. Наконец, есть диспетчер конфигураций, который, если он присутствует, можно запросить через WMI.

Я нашел функцию, которая мне очень нравится, чтобы проверить все четыре местоположения. Мне нужно будет доделать его с некоторыми параметрами для проверки удаленных компьютеров, но в целом это было отличное начало. Я адаптировал функцию так, чтобы она возвращала $true при первом удовлетворяющем условии, поскольку меня интересует только то, ожидает ли компьютер перезагрузки, а не источник перезагрузки.

Адаптировано из https://gist.github.com/altrive/5329377.

На основе http://gallery.technet.microsoft.com/scriptcenter/Get-PendingReboot-Query-bdb79542

function Test-PendingReboot { if (Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending" -EA Ignore) { return $true } if (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" -EA Ignore) { return $true } if (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Name PendingFileRenameOperations -EA Ignore) { return $true } try { $util = [wmiclass]"\.\root\ccm\clientsdk:CCM_ClientUtilities" $status = $util.DetermineIfRebootPending() if(($status -ne $null) -and $status.RebootPending){ return $true } }catch{}

return $false }

person Subhash Makkena    schedule 24.04.2017