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.
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.
Alternativ kann man natürlich auch die neueren CIM-Cmdlets verwenden:
Get-CimInstance -ClassName Win32_OperatingSystem | Select LastBootUpTime
Hier muss man am Format der Ausgabe nichts anpassen.
Task-Manager
Die Betriebszeit des Rechners kann man auch dem Task-Manager entnehmen. Die entsprechende Information findet sich unter Leistung.
Get-Uptime in PowerShell 6.x und 7.x
Seit PowerShell 6 steht mit Get-Uptime ein eigenes Cmdlet für diesen Zweck zur Verfügung, 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
Verwandte Beiträge
- Remotedesktop über WMI und PowerShell remote aktivieren
- BitLocker aktivieren mit manage-bde, PowerShell oder WMI
- BitLocker-Verschlüsselung auf allen PCs remote prüfen
- ThinPrint 13 unterstützt Microsofts V4-Druckertreiber und MMC
- PowerShell 7.3: JEA über SSH, Cmdlet für Setup, erweiterte ARM-Unterstützung
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.