7

我正在研究一种解决方案,通过 LAN 唤醒激活机器,然后 System Center 将更新推送到客户端电脑(运行 Windows 7)。

现在我正在编写一个脚本 (PowerShell/C#),它检查机器是否应该在更新完成后关闭。

如果机器是通过 Wake On Lan 激活的,并且自激活后没有用户登录机器,则可以安全地关闭机器。否则,机器应保持开启状态。

有没有办法检查计算机是如何被激活的?

4

2 回答 2

2

从 Windows 7(可能是 Vista)开始,当您唤醒计算机时,“Microsoft-Windows-Power-Troubleshooter”会在系统事件日志中提供一个日志,提供唤醒源。这是两个事件(在 Windows 8 桌面上拍摄,但我在 Window 7 笔记本电脑上也有相同的事件),第一个是由 WOL 生成的,第二个是使用正面按钮生成的:

在此处输入图像描述 在此处输入图像描述

因此,您可以使用 PowerShell 进行测试:

(Get-EventLog -LogName System -Source "Microsoft-Windows-Power-Troubleshooter" -AsBaseObject | Sort-Object {$_.timegenerated} | select -last 1 ).Message

这样你必须解析消息(不太好)

get-winevent -FilterHashtable @{"ProviderName"="Microsoft-Windows-Power-Troubleshooter";"id"=1}  | Sort-Object {$_.timecreated} | select -last 1 | %{([xml]$_.ToXml()).Event.EventData.Data}

备注: Microsoft-Windows-Power-Troubleshooter提供程序也存在于 W2K8-R2 上,当我尝试唤醒我的旧服务器之一时,这WakeSourceType是未知的。

于 2014-06-04T09:30:31.460 回答
1

这可能不是您正在寻找的,而是另一种方法:

  1. 在服务器端,记住 WOL 数据包的发送时间
  2. 在客户端,向服务器询问最后一个 WOL 数据包时间
  3. 在客户端,检查 PC 的正常运行时间,例如在 PowershellCodeplex Uptime中使用 WMI 获取正常运行时间
  4. 比较两者。也许考虑硬件启动过程的一些延迟。我不完全知道正常运行时间是按硬件还是软件计算的。
  5. 对于已登录的用户,您可以使用WMI 从 Powershell 登录用户
于 2014-06-04T08:41:36.977 回答