检查计算机是否通过远程唤醒已激活。

7
我正在处理一个解决方案,其中机器通过“远程唤醒”被激活,之后System Center将更新推送到客户端电脑(运行Windows 7)。
现在我正在编写一个脚本(PowerShell/C#),用于检查是否应该在更新完成后关闭计算机。
如果机器是通过“远程唤醒”被激活,并且自激活以来没有用户登录到该机器,则可以安全地关闭该机器。否则,该机器应保持开启状态。
有没有一种方法可以检查计算机是如何被激活的?

1
如果您知道何时发送了WOL数据包,那么您可以运行类似于https://github.com/pdxcat/Get-LogonHistory/blob/master/Get-LogonHistory.ps1的内容来查询最后一个用户登录。 - Vincent
我更加好奇的是,你如何确定更新是否完成安装。我只能想象,例如需要重新启动一次或多次的更新是否真的会告诉你,但现在我已经花了3个小时并重新启动了10次。 - Rand Random
2个回答

2
自从Windows 7(也许是Vista)以来,当您唤醒计算机时,“Microsoft-Windows-Power-Troubleshooter”会在系统事件日志中提供日志,以提供唤醒源。以下是两个事件(在Windows 8桌面上获取,但我在我的Windows 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未知。


1

这可能不是您要找的确切解决方案,但有一个替代方法:

  1. 在服务器端,记住发送WOL数据包的时间
  2. 在客户端上,请求服务器上次发送WOL数据包的时间
  3. 在客户端上,检查PC的正常运行时间,例如使用Powershell中的WMI for uptimeCodeplex Uptime
  4. 比较两者。也许需要考虑硬件引导过程的一些延迟。我不确定正常运行时间是由硬件还是软件计算的。
  5. 对于已登录用户,您可以使用Powershell中的WMI for logged on users

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接