Functions/Get-NtpDate.ps1
Function Get-NtpDate { <# .SYNOPSIS To get the time from an NTP server .DESCRIPTION To get the time from an NTP server. Will return a [DateTime] and accepts the -Verbose parameter. If request fails it will return "1/1/1900" .PARAMETER ComputerName The name or IPv4 address of the computer running NTP .PARAMETER Port The port number NTP is listening to. Defaults to 123 .EXAMPLE Get-NtpDate $DC Assuming $DC holds the name of the domain controller then would return a datetime similar to Monday, March 05, 2018 9:52:57 AM .OUTPUTS [datetime] #> [CmdletBinding()] Param ( [parameter(Mandatory, HelpMessage = 'Add help message for user', ValueFromPipeline, Position = 0)] [Alias('NtpServer')] [string] $ComputerName, [int] $Port = 123 ) begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" Write-Verbose -Message "Attempting to get time from NTP server $ComputerName" $oldEA = $ErrorActionPreference $ErrorActionPreference = 'Stop' } process { $Socket = New-Object -TypeName Net.Sockets.Socket -ArgumentList ( 'InterNetwork', 'Dgram', 'Udp' ) $Socket.SendTimeOut = 2000 # ms $Socket.ReceiveTimeOut = 2000 # ms try { $Socket.Connect( $ComputerName, $Port ) $NTPData = New-Object -TypeName byte[] -ArgumentList 48 $NTPData[0] = 27 # Request header: 00 = No Leap Warning; 011 = Version 3; 011 = Client Mode; 00011011 = 27 $Socket.Send( $NTPData ) | Out-Null $Socket.Receive( $NTPData ) | Out-Null $Seconds = [BitConverter]::ToUInt32( $NTPData[43..40], 0 ) (Get-Date -Date '1/1/1900' ).AddSeconds( $Seconds ).ToLocalTime() Write-Verbose -Message "Successfully received time from NTP $ComputerName" } catch { #get-date -date '1/1/1900' Write-Verbose -Message "Failed receiving time from $ComputerName, server not up, or not running NTP" Write-Error -Message "Could not make an NTP connection over port $Port to $ComputerName" } } end { $ErrorActionPreference = $oldEA Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } |