checkmk-plugins/check_mk-pending_reboot/agents/windows/plugins/pending_reboot.ps1
2019-08-12 11:59:29 +03:00

98 lines
6.9 KiB
PowerShell
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
## Check for pending restart status
$Computer = get-content env:computername
# Setting pending values to false to cut down on the number of else statements
$PendFileRename,$Pending,$SCCM = $false,$false,$false
# Setting CBSRebootPend to null since not all versions of Windows has this value
$CBSRebootPend = $null
# Querying WMI for build version
$WMI_OS = Get-WmiObject -Class Win32_OperatingSystem -Property BuildNumber, CSName -ComputerName $Computer -Authentication PacketPrivacy -Impersonation Impersonate
# Making registry connection to the local/remote computer
$RegCon = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]"LocalMachine", $Computer)
# If Vista/2008 & Above query the CBS Reg Key
if ($WMI_OS.BuildNumber -ge 6001){
$RegSubKeysCBS = $RegCon.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\").GetSubKeyNames()
$CBSRebootPend = $RegSubKeysCBS -contains "RebootPending"
}
else{
$CBSRebootPend = $false
}
# Query WUAU from the registry
$RegWUAU = $RegCon.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\")
$RegSubKeysWUAU = $RegWUAU.GetSubKeyNames()
$WUAURebootReq = $RegSubKeysWUAU -contains "RebootRequired"
# Query PendingFileRenameOperations from the registry
$RegSubKeySM = $RegCon.OpenSubKey("SYSTEM\CurrentControlSet\Control\Session Manager\")
$RegValuePFRO = $RegSubKeySM.GetValue("PendingFileRenameOperations",$null)
# If PendingFileRenameOperations has a value set $RegValuePFRO variable to $true
if ($RegValuePFRO){
$PendFileRename = $true
}
# Closing registry connection
$RegCon.Close()
# Determine SCCM 2012 Client Reboot Pending Status
# To avoid nested 'if' statements and unneeded WMI calls to determine if the CCM_ClientUtilities class exist, setting EA = 0
$CCMClientSDK = $null
$CCMSplat = @{
NameSpace='ROOT\ccm\ClientSDK'
Class='CCM_ClientUtilities'
Name='DetermineIfRebootPending'
ComputerName=$Computer
ErrorAction='SilentlyContinue'
}
$CCMClientSDK = Invoke-WmiMethod @CCMSplat
if ($CCMClientSDK){
if ($CCMClientSDK.ReturnValue -ne 0){
Write-Warning "Error: DetermineIfRebootPending returned error code $($CCMClientSDK.ReturnValue)"
}
if ($CCMClientSDK.IsHardRebootPending -or $CCMClientSDK.RebootPending){
$SCCM = $true
}
}
else{
$SCCM = $null
}
if($CBSRebootPend OR $WUAURebootReq -OR $PendFileRename -OR $SCCM){
$machineNeedsRestart = $true
}
else{
$machineNeedsRestart = $false
}
write-host "<<<pending_reboot>>>"
if($machineNeedsRestart){
if(!(Test-Path "./age1.txt")){
Get-Date -format G| Out-File ./age1.txt
}
$startDate=Get-Content "./age1.txt"
$currentDate=(Get-Date -format G)
$difference=(New-Timespan -Start $startDate -End $currentDate)
$diffOut=[math]::round($difference.TotalHours,0)
write-host "pendingReboot 1"$diffOut
}
else{
if(Test-Path "./age1.txt"){
Remove-Item ./age1.txt
}
if(!(Test-Path "./age2.txt")){
Get-Date -format G| Out-File ./age2.txt
}
$startDate=Get-Content "./age2.txt"
$currentDate=(Get-Date -format G)
$difference=(New-Timespan -Start $startDate -End $currentDate)
$diffOut=[math]::round($difference.TotalHours,0)
write-host "pendingReboot 0"$diffOut
}