PowerShell AD Zeitsync HTML Report (Update)

Die Zeitsynchronisation in Active Directory Umgebungen ist eine wichtige Komponente und sollte stets korrekt konfiguriert werden. Einzige Zeitquelle für Member-Server und Clients sollte der Domänen-Controller mit der FSMO-Rolle “PDCEmulator” sein. Weitere Hintergrundinformationen und Details zur Konfiguration findet Ihr in diesem Technet-Wiki Artikel: Active Directory: Time Synchronization.

Um Probleme mit der Zeitsynchronisation in großen Umgebungen schnell und einfach zu erkennen habe ich ein PowerShell Skript geschrieben welches einen HTML Status-Report zur Zeitsynchronisation erstellt. Verbesserungsvorschläge für das Skript sind gerne gesehen.

Update: Ich habe das Skript die letzten Tage nochmals an einigen Stellen verbessert die Zeitdifferenz wird sekundengenau gemessen, die Laufzeit des Skriptes spielt dabei keine Rolle.


Beispiel-Report:

Active Directory Zeitsync Report

PowerShell Report:

Report dient zur Überprüfung der Zeitsynchronisation in einer Active Directory Domäne

Skript läuft auf:

PK-DC-01

Active Directory PDC Emulator der Domäne:

PK-DC-01.kohn.blog

Zeitquelle des PDC Emulators:

ptbtime1.ptb.de,0x1

Zeitdifferenz zur Atomzeit der PTB:

Tracking ptbtime1.ptb.de [192.53.103.108:123]. Collecting 1 samples. The current time is 27.04.2018 21:51:44. 21:51:44, -00.0222059s

 

Servername Zeitquelle Zeitdifferenz
PK-APP-01.kohn.blog NT5DS -00.0463153s
PK-APP-02.kohn.blog NT5DS +00.0406644s
PK-APP-04.kohn.blog NT5DS -00.0013692s
PK-DB-01.kohn.blog NT5DS -00.0185201s
PK-DC-01.kohn.blog NTP +00.0000000s
PK-DC-02.kohn.blog NT5DS -00.0080002s
PK-EX-01.kohn.blog NT5DS -00.0761996s
PK-PS-01.kohn.blog NT5DS -00.0606141s
PK-RDB-01.kohn.blog NT5DS -00.1136670s
PK-RDS-01.kohn.blog NT5DS +00.1948417s
PK-RDS-02.kohn.blog NT5DS -00.0599737s
PK-RDS-03.kohn.blog NT5DS -00.0388423s
PK-RDS-04.kohn.blog NT5DS -00.0221559s
PK-RDAPP-01.kohn.blog NT5DS -00.0479391s

(c)Philipp Kohn, kohn.blog


PowerShell Skript Code:

<#
.SYNOPSIS
PowerShell Active Directory Time Sync Report (HTML)

.DESCRIPTION
PowerShell Skript zur Abfrage der Zeitquelle auf dem PDC Emulator und zur Überprüfung der Zeitsynchronisation in der Domäne, Ausgabe als HTML Report

.NOTES
Skript muss auf PDC Emulator ausgeführt werden.

.LINK
https://kohn.blog

Version
1.3

Date
27.04.18

(c)
Philipp Kohn, kohn.blog
#>

# FQDN aller Windows Server der Active Directory Domäne abfragen
$servers = Get-ADComputer -Filter {(OperatingSystem -like '*windows*server*') -and (Enabled -eq 'True')} -Properties DNSHostName | ForEach-Object {$_.DNSHostName}


# Domänencontroller mit FSMO-Rolle "PDC Emulator" abfragen
$PDCEmulator = Get-ADDomain | ForEach-Object {$_.PDCEmulator}

# Aktuelle Zeitsynchronisationsquelle abfragen
$PDCTimeSource = & "$env:windir\system32\w32tm.exe" /query /source

# Zeitdifferenz zwischen lokalem Zeitserver-Dienst und der Atomuhr der PTB Braunschweig (Betreibt die offiziellen Zeitserver in Deutschland EinhZeitG §6)
$PDCTimedifference = & "$env:windir\system32\w32tm.exe" /stripchart /computer:ptbtime1.ptb.de /samples:1 /dataonly

# Abfrage der Zeitdifferenz und Zeitquelle auf Remoteservern
$results = foreach ($server in $servers) {
         if (Test-WSMan -ComputerName $server -ErrorAction Ignore)
         {  [PSCustomObject]@{
             Servername = $server
             
             Zeitquelle = (Invoke-Command -ComputerName $server -ScriptBlock `
             {Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Parameters -Name Type | select-object -ExpandProperty Type})
             
             Zeitdifferenz = (Invoke-Command -ComputerName $server -ScriptBlock `
             {param($PDC) (& "$env:windir\system32\w32tm.exe" /stripchart /computer:$PDC /samples:1 /dataonly | select-object -last 1).Substring(10)} -ArgumentList $PDCEmulator)
           }
         }  else {Write-Warning -Message "Couldn't connect to $server please activate PowerShell Remoting"}
} 

# Ausgabe gesammelter Daten als HTML Report unter $env:USERPROFILE\documents\
$results | Select-Object -Property Servername,Zeitquelle,Zeitdifferenz | Sort-Object -Property Servername | `
ConvertTo-Html -CssUri https://kohn.blog/wp-content/uploads/2018/03/PK_PowerShell_HtmlReport.css `
-Title 'Active Directory Zeitsync Report' `
-PreContent `
"<p align=left><img src=https://kohn.blog/wp-content/uploads/2018/03/200x200_favicon.png></p>
  <h1><font color=BLACK>Active Directory Zeitsync Report</font></h1>
    <table>
        <tr><th><p align=left>PowerShell Report:</p></th>
        <td>Report dient zur Überprüfung der Zeitsynchronisation in einer Active Directory Domäne</td></tr>
        <tr><th><p align=left>Skript läuft auf:</p></th>
        <td>$env:computername</td></tr>
        <tr><th><p align=left>Active Directory PDC Emulator der Domäne:</p></th>
        <td>$PDCEmulator</td></tr>
        <tr><th><p align=left>Zeitquelle des PDC Emulators:</p></th>
        <td>$PDCTimeSource</td></tr>
        <tr><th><p align=left>Zeitdifferenz zur Atomzeit der PTB:</p></th>
        <td>$PDCTimedifference</td></tr>
    </table><br><br>" `
-PostContent '<br><br>(c)Philipp Kohn, kohn.blog' | `
Out-File -FilePath $env:USERPROFILE\documents\ADTimesync-Report_${env:computername}_$(get-date -Format dd-MM-yyyy-hhmm).html

 

Philipp Kohn

IT Consultant Specialties: Remote Desktop Services, Office 365, User Profile and Group Policy Management

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.