Memb
Memb

Reputation: 309

Find out if computer rebooted since the last time my program ran?

How can my program know if windows rebooted since the last time it ran? All versions of windows XP and on.

Upvotes: 3

Views: 1940

Answers (8)

Langdon
Langdon

Reputation: 20063

There's a Windows API call you can make called GetTickCount...

http://msdn.microsoft.com/en-us/library/ms724408%28VS.85%29.aspx

Edit: The idea is that when your program starts, you make a call to GetTickCount (which returns how many milliseconds Windows has been running), and then calculate an exact start date (right now minus the number of milliseconds). Store that date, and then the next time your program starts, calculate the date again and compare it to the previously stored date. If the dates are different, Windows has rebooted. Use GetTickCount64 if possible (but don't code your solution solely using this function.

Upvotes: 3

Stephen Nutt
Stephen Nutt

Reputation: 3306

This can be accomplished trivially using the global atom table. Just make sure your atom name is unlikely to conflict with another atom.

if (GlobalFindAtom ("MySecretName") == 0)
{
  // First time run since reboot
  GlobalAddAtom ("MySecretName");
}

Upvotes: 6

user180100
user180100

Reputation:

How about adding a file to %TMP% and check if it's still there (%TMP% should be cleared at each reboot by Windows)

or

more robust way, create a file somewhere and mark it for deletion on next reboot (see MoveFileEx API) and check that file

Upvotes: 0

Rob Walker
Rob Walker

Reputation: 47462

In the vein of ugly hacks ... stick something in one of the RunOnce registry keys

Upvotes: 0

Steve Schnepp
Steve Schnepp

Reputation: 4680

Simple, but ugly solution : just launch a never-ending dummy process :-)

If it's still here, you didn't reboot. If it's not, chances are that you have just rebooted.

Upvotes: 0

gwell
gwell

Reputation: 2753

The Microsoft utility uptime.exe "processes the machine's event log to determine system availability and current uptime".

Upvotes: 1

ctd
ctd

Reputation: 1793

net statistics workstation|find "Statistics since"

Upvotes: 1

Jeff Paquette
Jeff Paquette

Reputation: 7127

You can use WMI:

    strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)
    Wscript.Echo dtmSystemUptime
Next
Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _
         Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _
         & " " & Mid (dtmBootup, 9, 2) & ":" & _
         Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup, _
         13, 2))
End Function

Upvotes: 1

Related Questions