Windows PowerShell:响应 WMI 事件

跟踪、通知和响应系统级事件正是 Windows 所擅长的,但您也可以使用 Windows PowerShell 来完成这些任务。

Don Jones

有关 Windows 操作系统很不错的事情之一就是对事件的支持。 只要事情发生在操作系统中,它将生成一个事件。 位的应用程序,如的代码可以注册,以便它们可以与某些操作作出响应特定事件的通知。 例如对于时您单击对话框中的按钮上,应用程序收到一个的单击事件的通知,并知道做任何它最应该有人单击该按钮时执行操作。

Windows 管理规范 (WMI) 还可以生成事件,并可以注册以接收这些事件的 Windows PowerShell v2。 可以使用外壳程序以响应这些事件执行任何您喜欢的命令。 WMI 通常会引发一个数的事件,相当小,但可以这样做对于不同的 WMI 类的一个巨大的范围。

有三个关键点,以使用 WMI 事件:

  • 您知道哪些事件需要
  • 了解您希望该事件的类
  • 使用注册 WMIEvent cmdlet 来注册事件通知

简单的事件

某些 WMI 类生成的事件。 例如对于 Win32_ProcessStartTrace 类生成一个进程启动时的事件。 它还将执行,在其他情况下。 引发该事件的新进程时,它有一个源的标识符的进程开始。为事件注册,您将运行以下命令:

Register-WmiEvent –class "Win32_ProcessStartTrace" 
–sourceIdentifier "Process Started"

当然,只需知道一个进程已启动 isn’t 很有用。 您可能希望定义登录过程、 发送电子邮件或甚至终止该进程的某些操作。

运行 Get-EventSubscriber 来查看您刚刚创建的事件通知订阅。 若要删除所有的事件注册,运行 Get EventSubscriber | 注销事件。 注销事件也可以用于删除特定的订阅 ID 号。

更好的事件

WMI 可以产生的系统级事件的一些更有用。 每当创建 WMI 类的新实例 ; 例如对于激发称为 __instancecreationevent 事件__instancedeletionevent 时将触发一个实例将被删除。 这不似乎有用,但思考有关它的操作系统和计算机硬件的几乎每个元素由某些 WMI 类的实例。 例如对于 Win32_LogicalDisk 在将可移动存储设备连接时将获得一个新实例。 Win32_Process 在进程退出时将丢失实例。

要显示一条消息,当用户插入一个新的 USB 驱动器?

Register-wmievent –query "select * from __instancecreationevent within 5 where targetinstance isa 'win32_logicaldisk'" –action { Write "You had better not put any proprietary information on that!" }

该查询可能很难分解,因此这里最需要执行的操作:

  • SELECT * FROM __instancecreationevent (顺便说一下的在事件名称,两个下划线),只需指定应检索从该事件的所有属性。
  • 5 内表示我们只想检查存在事件每隔五秒钟。 don’t 设置此数值太低,或者您可以得到很多花上不断地检查更新的计算能力。
  • WHERE 目标实例 ISA 'Win32_LogicalDisk'告诉我们只需创建 Win32_LogicalDisk 类的新实例的事件的 WMI。

最后,–action 参数是一个脚本块 — 括在 {大括号} — 包含我们要时引发该事件发生的操作。

使用 –computerName 参数为远程计算机发生的事件注册了一个巧妙的窍门。 您需要在远程的计算机上的本地管理员和操作将发生这种情况不上是远程计算机上。

作为一个顺便,don’t 诱惑实例注册 CIM_DataFile 类,表示磁盘上的文件上创建事件。 WMI isn’t 非常有效,在监视新创建的文件。 它可能会错过的事件,并可以施加一些非常繁重的开销,在试图捕获所有内容。

需要注意的事项和技巧

当然,对您的事件的响应将仅为只要继续外壳程序正在运行。 当您关闭外壳程序,或由于某种原因关闭其自身上时,不见事件注册了。

使用户能够机器上运行的有点不太有用的 WMI 事件,因为根本是不可能最多有外壳程序和每个人的计算机上正在运行的时间。 这可以用于监视的进程或服务器上拥有更多的控件上的其他元素但,是一个非常有用的技巧

内 –action scriptblock 中,您将有权访问包含从该事件传递任何参数的自动变量调用的 $ 参数。 使用在您 –action scriptblock 写 $ args 若要查看哪些参数存在针对给定的 WMI 事件。

读取一位更多有关 WMI 事件和相关 的 TechNet WMI 事件监控的页面 上的外壳程序命令。

Don Jones

Don Jones 是 Concentrated Technology 的创始人,他会在 ConcentratedTech.com 解答有关 Windows PowerShell 和其他技术的问题。 他还是 Nexus.Realtimepublishers.com 的撰稿人,他的许多著作还在他的网站上以电子版的形式提供。

相关内容