How can I tell whether the system booted because of Wake-on-LAN (WoL) or because of the power button?
In Windows 10, I would like to know how I can tell in a script whether the system booted because it was turned on by receiving a Wake-on-LAN (WoL) packet, or because it was turned on because of pushing the power button.
I did find the WakeUpType property of the Win32_ComputerSystem class. That is documented to return the "event that causes the system to power up". There are 9 possible return values, one of them being "5" (meaning "LAN Remote").
Unfortunately, on my system it always seems to return "6" (meaning "Power Switch"):
PS C:\WINDOWS\system32> echo $(Get-WmiObject -class win32_computersystem).wakeuptype
6
I noticed that after putting the system to sleep and waking it using WoL, Windows posts an event in the System eventlog with source "Power-Troubleshooter" and event ID 1, containing the text:
Wake Source: Device -Intel(R) 82579V Gigabit Network Connection
Also, powercfg /lastwake
reports the NIC as the reason for waking up. So, at least when waking from sleep Windows is able to determine that it woke up because of a WoL packet, even though the WakeUpType property still returns "6" (Power Switch) in that case.
Unfortunately, when the system receives a WoL packet in S5 state it will properly power up and boot, but I can't tell that it booted because of WoL. powercfg /lastwake
shows exactly the same output as it does when the system powers on from S5 because of pushing the power button:
C:\WINDOWS\system32>powercfg /lastwake
Wake History Count - 0
How can I reliably tell, from any power state (up to S5), that the system powered on/woke up because of WoL?
Solution 1:
My approach would be to use dmidecode which will read data from the BIOS, with something like
dmidecode | findstr /R /C:"Wake-up"
Similarly to feitingen's answer to this question
If that doesn't work then your hardware must not be properly recording that value.