Windows PowerShell:回應 WMI 事件

追蹤、通知和回應系統層級事件是 Windows 的專長,不過您也可以利用 Windows PowerShell 加以處理。

Don Jones

Windows OS 不錯的優點是其支援的事件。 每次項目發生時在作業系統中就會產生一個事件。 應用程式,例如的碼的位元可以註冊,他們可以使用某些動作來回應特定事件的通知。 就例如按一下對話方塊中的按鈕時應用程式會收到一個 「 按一下 」] 事件的通知,以及知道要它做有人按下該按鈕時應該的任何項目。

Windows 管理檢測 (WMI) 也可以產生事件,您可以註冊 Windows PowerShell v2 接收這些事件。 就可以使用殼層執行您喜歡的任何命令,以回應這些事件。 WMI 通常會引發一個事件,相當小的數目,但是它可以做這樣的不同的 WMI 類別的大範圍的。

有三個重點来使用 WMI 事件:

  • 您知道哪些事件要
  • 了解要事件的類別
  • 使用登錄 WMIEvent 指令程式註冊事件通知

簡單的事件

有些 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!" }

該查詢可以是很難分解,所以這裡 ’s 它執行的動作:

  • SELECT * FROM __instancecreationevent (順便一提 ’s 在事件名稱,兩個底線),只需指定應該擷取從這個事件的所有屬性。
  • 5 中指出我們只想檢查每隔五秒的事件。 don’t 設得太低的這個數字,或您結束具有大量計算花上經常檢查更新的能力。
  • WHERE 目標執行個體 ISA 'Win32_LogicalDisk'我們只想建立 Win32_LogicalDisk 類別的新執行個體的事件告知 WMI。

最後,–action 參數是指令碼區塊 — 置於 {大括號} — 包含我們想要引發事件時,會發生的動作。

在遠端電腦上發生的事件註冊使用 –computerName 參數是一個不錯的技巧。 您必須在遠端的電腦上的本機系統管理員並不在遠端的一的您電腦上的動作將會發生。

為一個另外,don’t 會想要註冊執行個體 CIM_DataFile 類別,表示磁碟上的檔案上建立事件。 WMI isn’t 非常有效率,在監視新建立的檔案。 它有可能會遺漏事件,並可以強制一些很沈重的負荷,在嘗試捕捉所有項目。

警告與技巧

就說您事件的回應會只持續,只要殼層執行。 當您關閉殼層,或因某些原因而關閉自己時,事件登錄不存在的。

讓 WMI 事件有點較不適合在使用者 ’ 機器上執行,因為根本 ’re 可能不會有最多的殼層和每個人 ’s 電腦上正在執行的時間。 這可以不過,是一個相當有用的技巧,來監視處理程序] 或 [在伺服器上有多個控制項上的其他項目

–action] scriptblock 內,您會有包含任何由事件傳遞的引數的自動變數稱為的 $ 引數的存取。 若要查看哪些引數存在指定的 WMI 事件用於 –action scriptblock 寫入 $ 引數。

讀取位元更多關於 WMI 的事件,以及相關的殼層指令 的 TechNet WMI 事件監視的頁面

Don Jones

Don Jones 是一個 founder 集中技術,和 Windows PowerShell 和其他技術在 ConcentratedTech.com 的回答疑問。 他也 ’s 讓他的書籍的許多可為他的 Web 站台的免費電子版本的 Nexus.Realtimepublishers.com 的作者。

相關內容