如何判断由于LAN唤醒(WoL)还是电源button引起的系统启动?

Windows 10中,我想知道如何在脚本中告诉系统是否通过接收局域网唤醒(WOL)数据包打开系统,或者因为按下电源button而打开系统。

我find了Win32_ComputerSystem类的WakeUpType属性。 这被logging为返回“导致系统启动的事件”。 有9个可能的返回值,其中之一是“5”(意思是“LAN Remote”)。

不幸的是,在我的系统上似乎总是返回“6”(意思是“电源开关”):

PS C:\WINDOWS\system32> echo $(Get-WmiObject -class win32_computersystem).wakeuptype 6 

我注意到,在系统进入睡眠状态并使用WoL唤醒之后,Windows在系统事件日志中发布事件,其源代码为“Power-Troubleshooter”,事件ID为1,包含以下文本:

唤醒来源:设备-Intel(R)82579V千兆networking连接

而且, powercfg /lastwake报告NIC是唤醒的原因。 所以,至less当从睡梦中醒来时,即使WakeUpType属性在这种情况下仍然返回“6”(电源开关),由于WoL数据包的缘故,它能够确定它被唤醒。

不幸的是,当系统收到一个处于S5状态的WoL数据包时,它将正常启动和启动,但是我不能说因为WoL而启动它。 powercfg /lastwake显示与由于按下电源button而从S5开启系统时完全相同的输出:

 C:\WINDOWS\system32>powercfg /lastwake Wake History Count - 0 

如何从任何电源状态(至S5)可靠地判断出因为WoL而导致系统上电/唤醒?

我的方法是使用dmidecode ,这将从BIOS读取数据,类似的东西

dmidecode | findstr / R / C:“唤醒”

同feitingen对这个问题的回答一样

如果这不起作用,那么你的硬件不能正确logging这个值。

也许你可以设置一个脚本(或一个软件)来跟踪发送WOL数据包的PC上的事件。
这个脚本可以在一个文件的某个地方(networking共享?)写一些东西(当前的date/时间?),然后这个被唤醒的计算机可以检查这个共享的文件,并确定它是否被一个WOL包。