Ein Powershell Skript zum überwachen der NTP Einstellungen und der Uhrzeit auf Servern und Clients.
########################################################
# von Tobias Maffert - www.maffert.net - 04.2020
########################################################
# Was macht dieser Check:
# Ueberprueft ob die richtige Zeitsynchroniserungsquelle konfiguriert wurde
# Ueberprueft die Zeitdifferenz zwischen lokalem Zeitserver-Dienst und der Atomuhr der PTB und meldet bei Differenz
#
# Voraussetzungen:
# Erwartet die Eingabe des Server mit der uebeprueft wird ob die Zeit uebereinstimmt. (z.B. ptbtime1.ptb.de) - ansonsten wird ptbtime1.ptb.de genutzt
# Erwartet die Eingabe des Servers mit der PDC Emulator Rolle (z.B. srvdc01.mustermann.gmbh) - ansonsten wird bei Servern der ermittelte PDC genutzt
########################################################
Write-Host "NTP Check 1.11"
Write-Host "____________________________"
Write-Host ""
[int]$errorcount = 0
[int]$crit = 30
[int]$anzahlfehlercrit = 3
$source = $args[0]
$pdc = $args[1]
$status = ""
$anzahlversuche = (Get-ItemProperty "HKLM:\SOFTWARE\maffert.net\Scripts\Check_NTP" -ErrorAction SilentlyContinue)."Fehler" +1
if(!(Test-Path -Path "HKLM:\SOFTWARE\maffert.net" -ErrorAction SilentlyContinue))
    {
        New-Item -Path "HKLM:\SOFTWARE" -Name "maffert.net" -ItemType Directory | Out-Null
    }
if(!(Test-Path -Path "HKLM:\SOFTWARE\maffert.net\Scripts" -ErrorAction SilentlyContinue))
    {
        New-Item -Path "HKLM:\SOFTWARE\maffert.net" -Name "Scripts" -ItemType Directory | Out-Null
    }
if(!(Test-Path -Path "HKLM:\SOFTWARE\maffert.net\Scripts\Check_NTP" -ErrorAction SilentlyContinue))
    {
        New-Item -Path "HKLM:\SOFTWARE\maffert.net\Scripts" -Name "Check_NTP" -ItemType Directory | Out-Null
        Set-ItemProperty -Path "HKLM:\SOFTWARE\maffert.net\Scripts\Check_NTP" "Fehler" -Value "0" | Out-Null
    }
# Wenn kein Server zum ueberpruefen der Zeit angegeben wurde, wird ptb.de genutzt
$wsource = & "$env:windir\system32\w32tm.exe" /stripchart /computer:ptbtime1.ptb.de /samples:1 /dataonly
if ($source -eq "" -or $source -like "-logfile" -or !$source){
    if ($wsource -match "0x800705B4"){
        $source = "ptbtime3.ptb.de"
    }
    else{
        $source = "ptbtime1.ptb.de"
    }
}
# Was bin ich?
if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) {
$osInfo = (Get-CimInstance -ClassName Win32_OperatingSystem).ProductType
}
# Wenn DC oder Server dann
if ($osInfo -like "2" -or $osInfo -like "3"){
    if (Get-Command Get-ADDomain -ErrorAction SilentlyContinue)    {
    $PDCEmulator = Get-ADDomain | ForEach-Object {$_.PDCEmulator} -ErrorAction SilentlyContinue
    }
        
    $iam = [System.Net.Dns]::GetHostByName($env:computerName).HostName
# Bin ich der Zeitgeber?
    if ($PDCEmulator -like $iam){
        Write-Host "Rolle: PDC Emulator - Zeitserver der Domaene."
    }
}
# Ueberpruefe ob Daten ausgelesen werden koennen, wenn nicht ob Argumente angegeben wurden
if (($pdc -eq "" -or $pdc -like "-logfile" -or $pdc -match "task") -and ($PDCEmulator -eq "" -or !$PDCEmulator -or $PDCEmulator -match "task")){
write-host "Der PDC Emulator (zum abgleichen der Uhrzeit und der Einstellung) kann nicht ermittelt werden, bitte den PDC mit angeben (ABGLEICHSSERVER PDCSERVER)!"
exit 1
}
if ($PDCEmulator -eq "" -or !$PDCEmulator){
$PDCEmulator = $pdc
}
        
if (($pdc -eq "") -or ($pdc -like "-logfile") -or ($pdc -match "task") -or (!$pdc)){
$pdc = $PDCEmulator
}
# Welche Zeitquelle ist defininiert? 
$timesource = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\").Type
if ($timesource -like "NTP"){
    write-host "Zeitquelle: NTP - Die Zeit wird vom einem vorkonfigurierten NTP-Server bezogen."
}
elseif ($timesource -like "NT5DS"){
    write-host "Zeitquelle: NT5DS - Die Zeit wird vom dem PDC (Domaene) bezogen."
}
# Aktuelle Zeitsynchronisationsquelle abfragen
$PDCTimeSource = & "$env:windir\system32\w32tm.exe" /query /source
write-host "Zeitsynchronisationsquelle ist: $PDCTimeSource"
# Datum und Uhrzeit ausgeben
$datetime = (get-date).DateTime
write-host "Datum und Uhrzeit: $datetime"
# Zeitdifferenz zwischen lokalem Zeitserver-Dienst und der Atomuhr der PTB
$PDCTimedifference = & "$env:windir\system32\w32tm.exe" /stripchart /computer:$source /samples:1 /dataonly
$zeitdiff = ($PDCTimedifference | select-object -last 1).Substring(11)
# Pruefe auf Fehler bei der Zeitabfrage
if ($PDCTimedifference -match "0x800705B4"){
    write-host ""
    write-host "Unbekannt: NTP-Dienst unter $source kann nicht erreicht werden (Firewall Port 123 blockiert?!) - Anzahl der Versuche: $anzahlversuche"
    $errorcount++
}
elseif ($PDCTimedifference -match "0x80072af9"){
    write-host ""
    write-host "Unbekannt: Der angegebene Host $source ist unbekannt!"
    $errorcount++
    exit 2
}
elseif ($PDCTimedifference -match "0x80070426"){
    write-host ""
    write-host "Unbekannt: Der Dienst w32time ist nicht gestartet!"
    exit 2
}
if ($zeitdiff -match "0x800705B4"){}
else{
# Pruefe die Zeitdifferenz
    if ($zeitdiff -gt "$crit"){
        write-host = "FEHLER: Uhrzeit stimmt nicht ueberein! $zeitdiff"
        exit 2
    }
    else{
        write-host "OK: Uhrzeit wurde mit $source verglichen und stimmt ueberein."
    }
}
# Pruefe auf falsch konfigurierte NTP-Einstellungen
if ($PDCTimeSource -like "VM IC Time Synchronization Provider" -or $PDCTimeSource -like "Free-running System Clock" -or $PDCTimeSource -like "Local CMOS Clock"){
    $status = "FEHLER: NTP-Einstellungen sind nicht korrekt oder wurden nicht richtig konfiguriert!"
    $errorcount++
}
if ($PDCEmulator -like $iam){
}
else{
    if ($PDCTimeSource -notmatch $pdc){
        $status = "FEHLER: NTP-Einstellungen sind nicht korrekt oder wurden nicht richtig konfiguriert - falsche NTP Quelle!"
        $errorcount++
    }
}
# Fehlerbehandlung
if($errorcount -ge 1){
    $anzahlfehler = (Get-ItemProperty "HKLM:\SOFTWARE\maffert.net\Scripts\Check_NTP")."Fehler" +1
    Set-ItemProperty -Path "HKLM:\SOFTWARE\maffert.net\Scripts\Check_NTP" "Fehler" -Value "$anzahlfehler"| out-null
        if($anzahlfehler -ge $anzahlfehlercrit){
            exit 2 
        }
    exit 0
}
else{
Set-ItemProperty -Path "HKLM:\SOFTWARE\maffert.net\Scripts\Check_NTP" "Fehler" -Value "1" | Out-Null
    exit 0
} 
                    