在 Windows 10 中,我想知道如何在脚本中判断系统启动是因为它是通过接收 Wake-on-LAN (WoL) 数据包打开的,还是因为按下电源按钮而打开.
我确实找到了Win32_ComputerSystem类的 WakeUpType 属性。这被记录为返回“导致系统启动的事件”。有 9 个可能的返回值,其中之一是“5”(意思是“LAN 远程”)。
不幸的是,在我的系统上,它似乎总是返回“6”(意思是“电源开关”):
PS C:\WINDOWS\system32> echo $(Get-WmiObject -class win32_computersystem).wakeuptype
6
Run Code Online (Sandbox Code Playgroud)
我注意到在使系统进入睡眠状态并使用 WoL 唤醒它后,Windows 会在系统事件日志中发布一个事件,其中包含源“Power-Troubleshooter”和事件 ID 1,其中包含文本:
唤醒源:设备 -Intel(R) 82579V 千兆网络连接
此外,powercfg /lastwake
报告 NIC 作为唤醒的原因。因此,至少在从睡眠状态唤醒时,Windows 能够确定它是由于 WoL 数据包而唤醒的,即使在这种情况下 WakeUpType 属性仍然返回“6”(电源开关)。
不幸的是,当系统在 S5 状态下接收到 WoL 数据包时,它会正常启动并启动,但我无法判断它是因为 WoL 启动的。powercfg /lastwake
由于按下电源按钮,显示与系统从 S5 启动时完全相同的输出:
C:\WINDOWS\system32>powercfg /lastwake
Wake History Count - 0
Run Code Online (Sandbox Code Playgroud)
我如何从任何电源状态(直到 S5)可靠地判断系统是否因为 WoL 启动/唤醒?
我的问题是当客户端刚启动时没有应用组策略。启动后,客户端立即在事件日志中发布一条错误消息,其中包含源“GroupPolicy (Microsoft-Windows-GroupPolicy)”和事件 ID 1058:“处理组策略失败。[...]”。在详细信息选项卡中,错误代码是 50,代表 ERROR_NOT_SUPPORTED。这不仅仅是一个表面问题:策略确实没有正确应用:例如,映射的网络驱动器不在那里。等待一段时间后,执行“gpupdate”工作并且策略正常应用:映射的网络驱动器出现。
我能够重现问题的最简单场景:在新安装的 Windows Server 2012R2 上新创建的域,客户端是新安装的 Windows 10 64 位机器。该域仅由一个域控制器组成,与其他域没有任何关系。
由于错误消息指出 Windows 无法从域的 Sysvol 共享中读取 .GPT 文件,因此我尝试从命令提示符访问相同的文件。事实上,当我在启动后立即打开命令提示符时,我得到了这个:
C:\Users\username>dir \\domain.example.com\sysvol
The request is not supported.
Run Code Online (Sandbox Code Playgroud)
等待一两分钟后,执行相同的命令将给出目录列表。此时运行 gpupdate 会正常工作。
我确实将组策略设置“在计算机启动和登录时始终等待网络”设置为“已启用”,并且我知道应用了此策略:在同一个策略对象中指定了一个注册表设置,当我检查注册表时在客户端上有指定的设置。
其他可能相关的因素:
powercfg /h off
),因此每次启动都是完全启动,而不是快速启动这似乎更像是 SMB 问题而不是组策略问题。在服务器端嗅探连接显示了一些有趣的东西:我第一次执行命令时dir \\domain.example.com\sysvol
,在 DC 上的 Microsoft Message Analyzer 中显示以下内容:
每次我发出命令并收到错误时,都会发生第 2 …