Add windows_time_sync_auto_heal
This commit is contained in:
parent
71cf77de4d
commit
81563ba386
141
windows_time_sync_auto_heal
Normal file
141
windows_time_sync_auto_heal
Normal file
@ -0,0 +1,141 @@
|
||||
# ==============================
|
||||
# Windows Time Sync - Smart MSP Version
|
||||
# ==============================
|
||||
|
||||
function Ensure-Admin {
|
||||
if (-not ([Security.Principal.WindowsPrincipal] `
|
||||
[Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
|
||||
[Security.Principal.WindowsBuiltInRole]::Administrator)) {
|
||||
Write-Host "❌ Please run as Administrator!" -ForegroundColor Red
|
||||
exit
|
||||
}
|
||||
}
|
||||
|
||||
function Restart-TimeService {
|
||||
Stop-Service w32time -Force -ErrorAction SilentlyContinue
|
||||
Start-Sleep -Seconds 2
|
||||
Start-Service w32time
|
||||
}
|
||||
|
||||
function Repair-TimeService {
|
||||
Write-Host "🛠 Repairing Windows Time Service..." -ForegroundColor Yellow
|
||||
|
||||
Stop-Service w32time -Force -ErrorAction SilentlyContinue
|
||||
w32tm /unregister
|
||||
Start-Sleep -Seconds 2
|
||||
w32tm /register
|
||||
Start-Service w32time
|
||||
}
|
||||
|
||||
function Test-DomainReachable {
|
||||
try {
|
||||
$domain = (Get-CimInstance Win32_ComputerSystem).Domain
|
||||
if ($domain -eq $env:COMPUTERNAME) {
|
||||
return $false
|
||||
}
|
||||
|
||||
nltest /dsgetdc:$domain > $null 2>&1
|
||||
return $LASTEXITCODE -eq 0
|
||||
} catch {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Sync-Domain {
|
||||
Write-Host "🏢 Attempting Domain Sync..." -ForegroundColor Cyan
|
||||
|
||||
w32tm /config /syncfromflags:domhier /update
|
||||
Restart-TimeService
|
||||
|
||||
w32tm /resync /rediscover
|
||||
|
||||
Start-Sleep -Seconds 3
|
||||
}
|
||||
|
||||
function Sync-PublicNTP {
|
||||
Write-Host "🌏 Falling back to AU NTP servers..." -ForegroundColor Yellow
|
||||
|
||||
$ntpServers = "0.au.pool.ntp.org,0x1 1.au.pool.ntp.org,0x1 2.au.pool.ntp.org,0x1"
|
||||
|
||||
w32tm /config /manualpeerlist:"$ntpServers" /syncfromflags:manual /reliable:NO /update
|
||||
|
||||
Restart-TimeService
|
||||
|
||||
w32tm /resync
|
||||
|
||||
Start-Sleep -Seconds 3
|
||||
}
|
||||
|
||||
function Force-HardTimeFix {
|
||||
Write-Host "💥 Applying HARD fallback (manual correction)..." -ForegroundColor Red
|
||||
|
||||
try {
|
||||
$ntp = "0.au.pool.ntp.org"
|
||||
|
||||
$data = w32tm /stripchart /computer:$ntp /samples:1 /dataonly |
|
||||
Select-String ".*"
|
||||
|
||||
$time = ($data -split ',')[1].Trim()
|
||||
|
||||
if ($time) {
|
||||
Set-Date -Date $time
|
||||
Write-Host "✅ Time corrected from NTP server"
|
||||
} else {
|
||||
throw "No time received"
|
||||
}
|
||||
} catch {
|
||||
Write-Host "❌ Hard correction failed"
|
||||
}
|
||||
}
|
||||
|
||||
function Validate-Time {
|
||||
$source = (w32tm /query /source)
|
||||
|
||||
if ($source -match "Local CMOS Clock") {
|
||||
return $false
|
||||
}
|
||||
return $true
|
||||
}
|
||||
|
||||
function Show-Status {
|
||||
Write-Host "`n📊 Current Time Status:" -ForegroundColor Green
|
||||
w32tm /query /status
|
||||
Write-Host ""
|
||||
w32tm /query /source
|
||||
}
|
||||
|
||||
# ==============================
|
||||
# MAIN
|
||||
# ==============================
|
||||
|
||||
Ensure-Admin
|
||||
|
||||
Write-Host "=============================="
|
||||
Write-Host " Smart Time Sync Engine"
|
||||
Write-Host "==============================`n"
|
||||
|
||||
Repair-TimeService
|
||||
|
||||
$domainOK = Test-DomainReachable
|
||||
|
||||
if ($domainOK) {
|
||||
Sync-Domain
|
||||
} else {
|
||||
Write-Host "❌ Domain NOT reachable — switching to NTP" -ForegroundColor Red
|
||||
Sync-PublicNTP
|
||||
}
|
||||
|
||||
# Validate
|
||||
if (-not (Validate-Time)) {
|
||||
Write-Host "⚠ Still not syncing — retrying with NTP..." -ForegroundColor Yellow
|
||||
Sync-PublicNTP
|
||||
}
|
||||
|
||||
# Final fallback
|
||||
if (-not (Validate-Time)) {
|
||||
Force-HardTimeFix
|
||||
}
|
||||
|
||||
Show-Status
|
||||
|
||||
Write-Host "`n✅ Time sync process completed." -ForegroundColor Green
|
||||
Loading…
x
Reference in New Issue
Block a user