Как я могу проверить, нуждается ли сервер Windows в перезагрузке? Я делаю проект установщика. Когда пользователь запускает этот установщик, он не должен продолжать работу, если в операционной системе ожидается перезагрузка.
Как проверить, нуждается ли сервер в перезагрузке
Ответы (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 }