Tags: Kommandozeile, PowerShell, Remote-Verwaltung
Windows bietet mit net.exe und w32tm.exe schon lange zwei Dienstprogramme für die Kommandozeile, mit denen sich die Systemzeit von Remote-PCs abfragen lässt. PowerShell muss für die Aufgabe Get-Date remote ausführen oder WMI bemühen.
Eine zwischen den Mitgliedern einer Domäne abgestimmte Systemzeit ist wichtig, um eine fehlerfreie Replikation zwischen DCs sowie die Authentifizierung über Kerberos zu gewährleisten. Aus diesem Grund synchronisiert der Windows Time Service automatisch alle Clients und Member-Server mit einem der DCs (siehe dazu: Zeiteinstellungen in Windows-Domänen über NTP konfigurieren).
Abweichungen aufspüren mit net.exe
In der Praxis können trotzdem immer wieder Abweichungen auftreten, wenn etwa ein Rechner nach einem OS-Upgrade die Verbindung zum Zeitgeber verliert oder wenn VMs ihre Systemzeit mit dem Host synchronisieren. Möchte man in dieser Situation herausfinden, wie die Uhren verschiedener Remote-PCs gehen, dann helfen am besten die Tools für die Kommandozeile.
Am einfachsten zu handhaben ist dabei net.exe mit dem Parameter time:
net time \\computername
Alternativ zum Namen des Remote-Computers kann man jenen der Domäne angeben, um die Zeit des primären DC zu erhalten:
net time /domain:windowspro.local
Ergänzt man den Schalter /SET, dann kann man die Uhr des lokalen Rechners an der Domäne oder dem entfernten PC ausrichten.
Das Dienstprogramm net.exe benutzt für die Remote-Abfrage der Systemzeit einen RPC und ist somit unabhängig vom Time Service, falls dieser auf einem PC nicht laufen sollte oder falsch konfiguriert wurde. Gerade beim Troubleshooting kann sich das als Vorteil erweisen. Allerdings verliert auch dieses Tool den Zugriff auf einen Rechner, wenn die Abweichung der Systemzeiten zu groß ist.
Differenz anzeigen mit w32tm
Dagegen setzt w32tm.exe auf die Infrastruktur des Timer Service auf und nutzt NTP für die Kommunikation mit den Remote-PCs. Ein Pluspunkt dieses Tools sind die vielfältigen Optionen, mit denen es sich aufrufen lässt. Zudem besteht die Möglichkeit, gleiche mehrere Zielrechner als Argument zu übergeben:
w32tm /monitor /Computers:win81-l1,ws2012-dc1
Dieser Befehl gibt nicht die absolute Uhrzeit der entfernten PCs zurück, sondern die Abweichung ihrer Zeiteinstellung vom lokalen Rechner.
Aufgrund seiner Abhängigkeit vom Timer Service muss man bei diesem Kommando darauf gefasst sein, dass es mit einer Fehlermeldung wie ERROR_TIMEOUT aussteigt, wenn Probleme mit der Synchronisierung vorliegen.
PowerShell
Das Cmdlet für diese Aufgabe ist Get-Date, das ohne Angabe von Parametern einfach die lokale Systemzeit anzeigt. Allerdings gehört es zu den Kommandos, die kein Remoting unterstützen. Daher muss man erst explizit eine Remote-Session aufbauen und in dieser den Befehl absetzen:
Invoke-Command -ComputerName win81-L1 {get-date}
Dem Parameter Computername kann man wie gewohnt auch mehrere, durch Kommata getrennt Hostnamen übergeben.
Systemzeit über WMI abrufen
Alternativ zu Get-Date empfiehlt sich der Zugriff auf die WMI-Klasse Win32_LocalTime, um die Systemzeit von entfernten Rechnern auszulesen:
Get-CimInstance -ComputerName hv2016-vm1 -ClassName Win32_LocalTime|
ft Hour, Minute, Second -HideTableHeaders
Anstelle von Get-CimInstance kann man auch das ältere, RPC-basierte Get-WmiObject verwenden.
Die Ausgabe beider Kommandos wird man der Übersichtlichkeit halber aufbereiten. Dafür bietet sich wie oben die Verwendung von Format-Table (Alias ft) an, mit dem man auch die Spaltenüberschriften entfernen kann.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Pfad zu einer Programmdatei finden
- ThinPrint 13 unterstützt Microsofts V4-Druckertreiber und MMC
- PowerShell 7.3: JEA über SSH, Cmdlet für Setup, erweiterte ARM-Unterstützung
- Second-Hop-Problem: CredSSP für PowerShell-Remoting konfigurieren
- Windows Terminal 1.6 Preview erhält GUI für Einstellungen, v1.5 nun offizielles Release
Weitere Links