Function autoreboot on remoteuptime
This commit is contained in:
73
Functions/AutoReboot-on-RemoteUptime.ps1
Normal file
73
Functions/AutoReboot-on-RemoteUptime.ps1
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
Set-StrictMode -Version Latest
|
||||||
|
|
||||||
|
function Invoke-LocalRebootOnRemoteUptime {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Reboots local machine based on remote uptime. Optimized for RMM/NinjaRMM.
|
||||||
|
|
||||||
|
.PARAMETER RemoteComputerName
|
||||||
|
The target server to compare against.
|
||||||
|
.PARAMETER DryRun
|
||||||
|
If present, logs what would happen without actually rebooting.
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$RemoteComputerName,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $false)]
|
||||||
|
[switch]$DryRun
|
||||||
|
)
|
||||||
|
|
||||||
|
process {
|
||||||
|
$BasePath = $PSScriptRoot
|
||||||
|
$LogPath = Join-Path -Path $BasePath -ChildPath "Logs"
|
||||||
|
$Timestamp = Get-Date -Format "yyyyMMdd-HHmm"
|
||||||
|
$LogFile = Join-Path -Path $LogPath -ChildPath "UptimeCheck_$($Timestamp).txt"
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (-not (Test-Path -Path $LogPath)) {
|
||||||
|
New-Item -Path $LogPath -ItemType Directory -Force | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Verbose "Testing connection to $RemoteComputerName..."
|
||||||
|
if (-not (Test-Connection -ComputerName $RemoteComputerName -Count 1 -Quiet)) {
|
||||||
|
Write-Error "Remote server $RemoteComputerName unreachable."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$LocalOS = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop
|
||||||
|
$RemoteOS = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $RemoteComputerName -ErrorAction Stop
|
||||||
|
|
||||||
|
$LocalBoot = $LocalOS.LastBootUpTime
|
||||||
|
$RemoteBoot = $RemoteOS.LastBootUpTime
|
||||||
|
|
||||||
|
Write-Output "Local Boot: $LocalBoot | Remote Boot: $RemoteBoot"
|
||||||
|
|
||||||
|
if ($RemoteBoot -gt $LocalBoot) {
|
||||||
|
$Msg = "MATCH: Remote rebooted more recently. Local reboot required."
|
||||||
|
|
||||||
|
if ($DryRun) {
|
||||||
|
Write-Warning "[DRY RUN]: $Msg (Reboot suppressed by switch)"
|
||||||
|
$("[DRY RUN] " + $Msg) | Out-File -FilePath $LogFile -Append
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output "Executing Reboot..."
|
||||||
|
$Msg | Out-File -FilePath $LogFile -Append
|
||||||
|
# Force restart immediately for RMM context
|
||||||
|
Restart-Computer -Force -Confirm:$false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output "No action needed. Local system is up to date."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Error "Script Failed: $($_.Exception.Message)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# NinjaRMM Script Variable Mapping (Example)
|
||||||
|
# Ensure you have a script variable in Ninja called 'RemoteServer'
|
||||||
|
Invoke-LocalRebootOnRemoteUptime -RemoteComputerName $RemoteComputerName
|
||||||
Reference in New Issue
Block a user