Powershell: NTP / Zeit Check auf Servern und Clients

Hinweis: Wir haben in diesem Artikel möglicherweise Provisions-Links verwendet und sie durch (*) gekennzeichnet. Erfolgt über diese Links eine Bestellung, erhält maffert.net eine Provision. Es entstehen für Sie keine Nachteile beim Kauf oder Preis.

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
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert