2
0

Function autoreboot on remoteuptime

This commit is contained in:
2026-02-18 08:12:34 +01:00
parent 96f2085a20
commit f6b700423f

View 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