-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTest-NTP.ps1
More file actions
79 lines (67 loc) · 2.65 KB
/
Test-NTP.ps1
File metadata and controls
79 lines (67 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
function Test-NtpServer {
param (
[Parameter(Mandatory = $true)]
[string]$NtpServer
)
Write-Host "`n⏱️ Querying NTP server: $NtpServer (UDP 123)...`n"
$ntpData = New-Object byte[] 48
$ntpData[0] = 0x1B # LI = 0, VN = 3, Mode = 3 (client)
$localSystemTime = [DateTime]::UtcNow
Write-Host "📅 Local System Time (UTC): $($localSystemTime.ToString("u"))"
try {
$ip = [System.Net.Dns]::GetHostAddresses($NtpServer)[0]
} catch {
Write-Warning "❌ Host not resolvable: $NtpServer"
return
}
$remoteEP = New-Object System.Net.IPEndPoint($ip, 123)
$udp = New-Object System.Net.Sockets.UdpClient
$udp.Client.ReceiveTimeout = 3000
$sendTime = [DateTime]::UtcNow
try {
[void]$udp.Send($ntpData, $ntpData.Length, $remoteEP)
} catch {
Write-Warning "❌ Failed to send UDP packet (firewall or unreachable network)."
return
}
try {
$remoteRef = $null
$recvData = $udp.Receive([ref]$remoteRef)
$recvTime = [DateTime]::UtcNow
} catch {
Write-Warning "❌ No response received (timeout or UDP 123 blocked)."
return
} finally {
$udp.Close()
}
Write-Host "`n✅ Response received from $($remoteRef.Address):"
Write-Host "🔹 Raw Response (Hex Dump):"
($recvData | ForEach-Object { "{0:X2}" -f $_ }) -join ' ' | Write-Host
function Convert-NtpTime ($bytes) {
$int = [BitConverter]::ToUInt32($bytes[0..3], 0)
$frac = [BitConverter]::ToUInt32($bytes[4..7], 0)
$ms = $int * 1000 + ($frac * 1000 / 0x100000000)
(Get-Date "1900-01-01Z").AddMilliseconds($ms)
}
# Extract key fields
$stratum = $recvData[1]
$refTime = Convert-NtpTime $recvData[16..23]
$originate = Convert-NtpTime $recvData[24..31]
$receive = Convert-NtpTime $recvData[32..39]
$transmit = Convert-NtpTime $recvData[40..47]
# Offset and delay calculation
$roundTrip = ($recvTime - $sendTime) - ($transmit - $receive)
$offset = (($receive - $sendTime) + ($transmit - $recvTime)) / 2
# Output as object
[PSCustomObject]@{
Server = $NtpServer
IPAddress = $ip.IPAddressToString
Stratum = $stratum
NtpTime_UTC = $transmit.ToString("u")
LocalTime_UTC = $recvTime.ToString("u")
LocalSystemTime_UTC = $localSystemTime.ToString("u")
Offset_vs_Local_ms = "{0:N2}" -f $offset.TotalMilliseconds
RoundTrip_ms = "{0:N2}" -f $roundTrip.TotalMilliseconds
RawBytes_Hex = ($recvData | ForEach-Object { "{0:X2}" -f $_ }) -join ' '
}
}