Tags: PowerShell, Remote-Verwaltung, WMI
Manchmal möchte man wissen, wie lange ein Windows-Server bereits unterbrechungsfrei läuft, also wie viel Zeit seit dem letzten Boot-Vorgang verstrichen ist. Im Gegensatz zu Linux gehört zum Lieferumfang von Windows kein eigener Befehl für diesen Zweck. Allerdings gibt es verschiedene Möglichkeiten, diese Information auszulesen, und zwar auch remote.
Unter den gängigen Empfehlungen, wie man die Systemlaufzeit ermitteln kann, befindet sich stets der Hinweis auf systeminfo.exe. Das Kommandozeilen-Tool gibt eine Vielzahl von Daten aus, darunter auch das letzte Boot-Datum. Aus dem gesamten Output kann man es via find ausfiltern:
systeminfo| find /i "Systemstartzeit:"
Remote-Abfrage mit systeminfo
Dieses Vorgehen hat jedoch den Nachteil, dass systeminfo.exe ziemlich lange braucht, bis es alle Daten ermittelt hat. Aber immerhin funktioniert es auch remote, indem man den Schalter /s mit dem Namen des Computers verwendet, also beispielsweise:
systeminfo /s server-core| find /i "Systemstartzeit:"
Nur lokal: net statistics und Task-Manager
Flinker ist das auf Microsoft TechNet empfohlene net statistics. Auch hier muss man die eigentliche Information über einen find-Filter extrahieren:
net statistics server|find /i "Statistik seit"
Es fällt allerdings auf, dass das Ergebnis von net statistics von dem aller anderen Tools abweicht, zum Teil sogar um Tage. Außerdem funktioniert es nur lokal. Das gilt auch für den Task-Manager, der in der Registerkarte Leistung unter Laufzeit die seit dem letzten Boot-Vorgang verstrichene Zeit angibt.
Boot-Historie mit uptime.exe auflisten
Dagegen ist uptime.exe, das aus NT-Zeiten stammt und von Microsofts Website heruntergeladen werden kann, in der Lage, auch Daten von Remote-Computern einzusammeln. Im Gegensatz zu den anderen Tools zeigt es nicht das letzte Boot-Datum, sondern errechnet gleich die seitdem vergangene Zeit.
Eine interessante Option bietet sich dabei mit dem Schalter /s, der Boot-Statistiken über einen längeren Zeitraum liefert und so eine gute Übersicht über die Verfügbarkeit einer Maschine ermöglicht.
uptime server-core /s
gibt Auskunft darüber, wann der Computer mit dem Namen server-core gestartet bzw. heruntergefahren wurde.
WMI-Abfrage mit wmic und Powershell
Die meisten der genannten Tools bedienen sich wahrscheinlich hinter den Kulissen eines WMI-Aufrufs, um an die geforderten Systemdaten zu kommen. Man kann WMI aber auch explizit nutzen, um die Uptime eines Servers zu ermitteln. Das geht beispielsweise über das Kommandozeilen-Tool wmic:
wmic /Node:"Computername" OS Get LastBootUpTime
Der Nachteil von wmic besteht darin, dass die Ausgabe des Datums und der Uhrzeit im Format yyyymmddhhmmss erfolgt und damit ziemlich unübersichtlich ist. Ruft man dagegen die Informationen über WMI in Powershell ab, dann hat man dort die Mittel, die Ausgabe anders zu formatieren:
$wmi=Get-WmiObject -computername srv -Class Win32_OperatingSystem
$wmi.converttodatetime($wmi.lastbootuptime)
Die Funktion converttodatetime gibt Datum und Uhrzeit nicht nur in einem besser lesbaren Format aus, sondern errechnet zusätzlich auch noch den Wochentag.
Will man die Uptime eines entfernten Rechners erfragen, dann muss ihn über den Parameter -computername angeben. Die Powershell-Variante ist wie immer zu bevorzugen, wenn man die Ausgabe einer WMI-Abfrage in einem Script weiterverarbeiten will.
Get-Uptime in PowerShell 6.x und 7.x
In PowerShell 6 kam mit Get-Uptime ein eigenes Cmdlet für diesen Zweck hinzu, das diese Aufgabe deutlich vereinfacht. Ruft man es ohne Parameter auf, gibt es die seit dem letzten Systemstart verflossene Zeit in verschiedenen Einheiten an (Tage, Stunden, Ticks, Millisekunden, etc.).
Möchte man den Zeitpunkt des letzten Starts erhalten, dann ruft man
Get-Uptime -Since
auf.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
Weitere Links
4 Kommentare
Gutes Beispiel, das sehr schön zeigt, dass sich in der PowerShell auch Tools verwenden lassen, mit denen Administratoren bereits seit Jahren arbeiten. Der Vorteil von PowerShell kommt immer dann ins Spiel, wenn der Output "objektorientiert" (sprich mit Cmdlets wie Select-Object oder Where-Object) weiterverarbeitet werden soll.
Hallo,
mit
systeminfo| find /i "Systemstartzeit:"
erhalte ich
FIND: Ungültige Paramterformat.
Habe dies jetzt mit select-string gelöst.
systeminfo| select-string"Systemstartzeit:"
Grüße
Hallo,
Fehler an find war, dass ich es in der PowerShell aufgerufen habe. Über die CMD klappt es.
Grüße
Hallo Roger, danke für die Ergänzungen! Eine Alternative zu find wäre noch findstr, das auch unter Powershell funktioniert.