none
Zeitpunkt des letzten Systemstarts auslesen RRS feed

  • Frage

  • Hallo zusammen,

    ich arbeite derzeit an einem Script, bei dem ich die Zeit seit dem letzen Neustart benötige.

    Betriebssystem: WIN7 Enterprise (SP1) 32 Bit

    Momentan ermittle ich diesen Wert mittels der Eigenschaft "LastBootUpTime" des WMI-Objects "Win32_OperatingSystem"

     

    $lastboottime = (Get-WmiObject -Class Win32_OperatingSystem).LastBootUpTime
    $sysuptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($lastboottime)
    

     

    Wie sich jetzt allerdings herausgestellt hat, wird der LastBootUpTime Zeitstempel verändert wenn sich der Rechner im Ruhezustand befunden hat.

    Und zwar wird dieser Zeitstempel genau um die Zeit erhöht, für die der Rechner im Ruhezustand war.

    Ich habe das Ganze kurz getestet:

    Auslesen der Daten vor dem Ruhezustand:

      LastBootUpTime: 04/18/2011 08:30:21
      SysUpTime: 0d 1h 10m

    Dann wurde der Rechner in den Ruhezusand versetzt und nach etwa 20 min wieder aufgeweckt:

      LastBootUpTime: 04/18/2011 08:52:21
      SysUpTime: 0d 1h 12m

     

    Wie man erkennt wurde der Zeitstempel genau um die Zeit verändert, für die sich der Rechner im Ruhezusand befand, was dazu führt, dass die SysUpTime falsch berechnet wird.

     

    jetzt meine Fragen:

    1. Handelt es sich hier um einen Bug oder ein Feature?

    2. Kann jemand auf einem anderen Rechner dieses Verhalten nachvollziehen oder liegt das an meiner Konfiguration oder meinem Rechner?

    3. Gibt es eine andere Möglichkeit die Zeit zu berechnen, wie lange der Rechner schon läuft.
        Hier möchte ich noch darauf hinweisen, dass auch der Befehl "systeminfo" die falsche Systemstartzeit liefert

     

    Vielen Dank schon mal!

     

    Viele Grüße

    Simon Schr.

     


    Montag, 18. April 2011 09:22

Antworten

  •  

    Hallo Simon.

    zu 1: Da der Eintrag .LastBootTime heißt, macht das von dir beobachtete Verhalten durchaus Sinn. Denn auch aus dem Hibernation-Modus wird gebootet, nur eben in ein zuvor gespeichertes Ram-Image.
    Abgesehen davon, wenn man die System Uptime berechnen möchte und .LastBootTime den Hibernationmodus ignorieren würde, hätte der Wert wenig Aussagekraft, da du nicht wissen kannst wie lange der Rechner seit der letzten Boottime in Hibernation war.

    zu 2: Ich habe es nicht getestet, aber s.o.

    zu 3: Du kannst das Eventlog benutzen. Z.b so:

    function FNgetBootEvent { 	 			  
    	 ### Events lesen
    	 $log = Get-EventLog -logname System | ? {$_.EventID -eq "12" -and $_.Source -eq "Microsoft-Windows-Kernel-General"} 
    	 
    	 if ($log) { ### Datum des letzten Kaltstarts filtern
    	 if( $log -is[array]){
    	 		$x =$log[0].TimeWritten
    			$y = $log[0].MachineName
        }
    		else {
    			$x =$log.TimeWritten
    			$y = $log.MachineName 
        }
    		$script:sysUT = (Get-Date)-(Get-Date $x) # Berechne verstrichene Zeit		
    		 
    		Set-Content "j:\bootlog_$y.txt" $x	
    	 }		
    }
    
    FNgetBootEvent
    Write-Host "Zeit seit letztem Kaltstart = "$sysUT


    Dies berechnet die Zeit seit dem letzten Kaltstart-Event und schreibt sie in eine Logdatei. Aber wie oben bereits erwähnt, dies ist nicht die System Uptime, also die Zeit die der Rechner wirklich gelaufen ist, da Sleep- und Hibernation-Zeiten ignoriert werden.

    Grüße, Denniver

     


    http://bytecookie.wordpress.com/

    • Als Antwort markiert Simon Schr Dienstag, 19. April 2011 06:16
    Montag, 18. April 2011 12:18
    Moderator

Alle Antworten

  • Hallo Simon,

    ich kann Dir nur einen Tip zu Punkt 3 geben. Schreib die LastBootUpTime in ein File, das Du nachher jederzeit auslesen kannst.

    Gruß

    Armin

    Montag, 18. April 2011 09:28
  • Hallo Armin,

    danke schon mal für die Antwort. 

    An die Möglichkeit hatte ich auch schon gedacht.

    Allerdings soll dieses Script, wenn es fertig ist, auf etwa 1500 Rechnern laufen.

    Und da würde ich (und vor allem mein Chef =) ) gerne möglichst "saubere Möglichkeiten" nutzen. 

    Soll heißen, dass ich diese Infos immer "live" auslesen soll.

     

    Das hätte ich evtl. auch schon oben mit rein schreiben sollen. Sorry.

     

    Gruß

    Simon

     

    Montag, 18. April 2011 09:41
  •  

    Hallo Simon.

    zu 1: Da der Eintrag .LastBootTime heißt, macht das von dir beobachtete Verhalten durchaus Sinn. Denn auch aus dem Hibernation-Modus wird gebootet, nur eben in ein zuvor gespeichertes Ram-Image.
    Abgesehen davon, wenn man die System Uptime berechnen möchte und .LastBootTime den Hibernationmodus ignorieren würde, hätte der Wert wenig Aussagekraft, da du nicht wissen kannst wie lange der Rechner seit der letzten Boottime in Hibernation war.

    zu 2: Ich habe es nicht getestet, aber s.o.

    zu 3: Du kannst das Eventlog benutzen. Z.b so:

    function FNgetBootEvent { 	 			  
    	 ### Events lesen
    	 $log = Get-EventLog -logname System | ? {$_.EventID -eq "12" -and $_.Source -eq "Microsoft-Windows-Kernel-General"} 
    	 
    	 if ($log) { ### Datum des letzten Kaltstarts filtern
    	 if( $log -is[array]){
    	 		$x =$log[0].TimeWritten
    			$y = $log[0].MachineName
        }
    		else {
    			$x =$log.TimeWritten
    			$y = $log.MachineName 
        }
    		$script:sysUT = (Get-Date)-(Get-Date $x) # Berechne verstrichene Zeit		
    		 
    		Set-Content "j:\bootlog_$y.txt" $x	
    	 }		
    }
    
    FNgetBootEvent
    Write-Host "Zeit seit letztem Kaltstart = "$sysUT


    Dies berechnet die Zeit seit dem letzten Kaltstart-Event und schreibt sie in eine Logdatei. Aber wie oben bereits erwähnt, dies ist nicht die System Uptime, also die Zeit die der Rechner wirklich gelaufen ist, da Sleep- und Hibernation-Zeiten ignoriert werden.

    Grüße, Denniver

     


    http://bytecookie.wordpress.com/

    • Als Antwort markiert Simon Schr Dienstag, 19. April 2011 06:16
    Montag, 18. April 2011 12:18
    Moderator
  • Hallo Denniver,

    Das ist genau was ich brauche! :)

    Vielen Dank, du hast mir echt geholfen!

    Auch danke für die ausführliche Erklärung!

     

    Viele Grüße, Simon

     

    Dienstag, 19. April 2011 06:16