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
}