| Server IP : 123.56.80.60 / Your IP : 216.73.216.78 Web Server : Apache/2.4.54 (Win32) OpenSSL/1.1.1s PHP/7.4.33 mod_fcgid/2.3.10-dev System : Windows NT iZhx3sob14hnz7Z 10.0 build 14393 (Windows Server 2016) i586 User : SYSTEM ( 0) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : C:/Windows/diagnostics/system/WindowsUpdate/ |
Upload File : |
# Copyright ©, Microsoft Corporation. All rights reserved.
trap {break}
# Check whether the system time is accurate
# Function to parse the strip data with time server
function Parse-OffsetData($offsetData = $(throw "No offset data is specified"))
{
if($offsetData -eq $null)
{
return $null
}
$result = @()
[string]$pattern = "\d{2,}:\d{2}:\d{2},\W([+-]\d{2,})\.\d{7}s"
$offsetData.GetEnumerator() | ForEach-Object {
if(($_ -match $pattern) -and ($matches[1] -ne $null))
{
$result += [long]$matches[1]
}
}
return $result
}
# Function to check whether the system time is accurate
function Test-Offset([int]$offset = $(throw "No offset is specified"))
{
[int]$maxOffset = (5 * 60)
return ([Math]::Abs($offset) -lt $maxOffset)
}
# Function to get time service status
function Get-ServiceStatus([string]$serviceName=$(throw "No service name is specified")) {
[bool]$startService = $true
[WMI]$timeService = @(Get-WmiObject -Query "Select * From Win32_Service Where Name = `"$serviceName`"")[0]
if($null -ne $timeService) {
[ServiceProcess.ServiceControllerStatus]$timeServicesStatus = (Get-Service $serviceName).Status
if(([ServiceProcess.ServiceControllerStatus]::Stopped -eq $timeServicesStatus) -or ([ServiceProcess.ServiceControllerStatus]::StopPending -eq $timeServicesStatus)) {
$startService = $false
}
}
return $startService
}
# Function to check whether the system time is accurate
Function Check-TimeAccurateness([string]$timeServer = $(throw "No time source is specified"))
{
[bool]$checked = $false
if(-not[String]::IsNullOrEmpty($timeServer))
{
(ping.exe $timeServer /n 2) | Out-Null
if($LASTEXITCODE -eq 0)
{
[int]$sampleCount = 1
[DateTime]$accurateion = [DateTime]::Now
$offsetData = (w32tm.exe /stripchart /computer:$timeServer /dataonly /samples:$sampleCount)
(Parse-OffsetData $offsetData) | Foreach-Object {
if(-not(Test-Offset $_))
{
$timeDifference = $_
$accurateion = [DateTime]::Now.Add([TimeSpan]::FromSeconds($_))
$checked = $true
Update-DiagRootCause -id "RC_DateTime" -Detected $true -parameter @{'AccurateTime'=$accurateion.ToString()}
} else {
Update-DiagRootCause -id "RC_DateTime" -Detected $false -parameter @{'AccurateTime'=$accurateion.ToString()}
$checked = $true
}
}
}
}
return $checked
}
# function to get the startup type of a serivce
function GetServiceStartupType([string]$serviceName) {
[string]$state = "Disabled"
[WMI]$service = @(Get-WmiObject -Query "Select * From Win32_Service Where Name = `"$serviceName`"")[0]
if($null -ne $service) {
$state = $service.StartMode
}
return $state
}
if("Disabled" -eq (GetServiceStartupType "W32time")) {
return
}
[bool]$timeServiceStatus = Get-ServiceStatus "w32time"
try {
if(-not($timeServiceStatus)) {
Start-Service "w32time"
WaitFor-ServiceStatus "w32time" ([ServiceProcess.ServiceControllerStatus]::Running)
}
[string]$timeServerInfo = (w32tm.exe /query /source)
if($LASTEXITCODE -ne 0)
{
return
}
[string]$timeServer = $timeServerInfo.Split(',', [StringSplitOptions]::RemoveEmptyEntries)[0].Trim()
if(-not(Check-TimeAccurateness $timeServer))
{
$timeServer = "time.windows.com"
[bool]$checked = Check-TimeAccurateness $timeServer
if(-not($checked)) {
[DateTime]$accurateion = [DateTime]::Now
Update-DiagRootCause -id "RC_DateTime" -Detected $false -parameter @{'AccurateTime'=$accurateion.ToString()}
}
}
} finally {
if(-not($timeServiceStatus)) {
Stop-Service "w32time"
WaitFor-ServiceStatus "w32time" ([ServiceProcess.ServiceControllerStatus]::Stopped)
}
}