C# 检查计算机是否通过局域网唤醒激活

C# 检查计算机是否通过局域网唤醒激活,c#,powershell,wake-on-lan,C#,Powershell,Wake On Lan,我正在开发一个解决方案,在这个解决方案中,计算机通过局域网唤醒激活,然后System Center将更新推送到客户端pc(运行Windows 7) 现在,我正在编写一个脚本(PowerShell/C#),该脚本检查更新完成后机器是否应该关闭 如果机器通过唤醒Lan激活,并且自激活后没有用户登录到机器,则可以安全关闭机器。否则,机器应保持开启状态 有没有办法检查电脑是如何被激活的 这可能不是您想要的,而是另一种方法: 在服务器端,还记得WOL数据包是何时发送的吗 在客户端,向服务器询问最后一个WO

我正在开发一个解决方案,在这个解决方案中,计算机通过局域网唤醒激活,然后System Center将更新推送到客户端pc(运行Windows 7)

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

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


有没有办法检查电脑是如何被激活的

这可能不是您想要的,而是另一种方法:

  • 在服务器端,还记得WOL数据包是何时发送的吗
  • 在客户端,向服务器询问最后一个WOL数据包的时间
  • 在客户端,检查电脑的正常运行时间,例如使用或
  • 比较两者。也许会考虑硬件启动过程中的一些延迟。我不知道正常运行时间是按硬件还是软件计算的
  • 对于已登录的用户,您可以使用
  • 从Windows 7(可能是Vista)开始,当您唤醒计算机时,“Microsoft Windows Power疑难解答”在系统事件日志中提供一个日志,给出唤醒源。以下是两个事件(在Windows 8桌面上拍摄,但在我的Windows 7笔记本电脑上有相同的事件),第一个事件是由WOL生成的,第二个事件是使用正面按钮生成的:

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

    (Get-EventLog -LogName System -Source "Microsoft-Windows-Power-Troubleshooter" -AsBaseObject | Sort-Object {$_.timegenerated} | select -last 1 ).Message
    
    这样,您必须解析消息(不太好)


    备注:Microsoft Windows Power疑难解答提供程序也存在于W2K8-R2上,当我尝试在局域网上唤醒我的一台旧服务器时,
    WakeSourceType
    未知。

    如果您知道何时发送WOL数据包,然后你可以运行类似于查询上次用户登录的操作。我更好奇的是,你如何确定更新是否完成了安装,我可以想象,例如,需要重新启动一次或更频繁的更新确实会告诉你这一点,但现在我在3小时后重新启动10次。
    get-winevent -FilterHashtable @{"ProviderName"="Microsoft-Windows-Power-Troubleshooter";"id"=1}  | Sort-Object {$_.timecreated} | select -last 1 | %{([xml]$_.ToXml()).Event.EventData.Data}