註冊系統登錄事件

若要從 系統登錄 提供者接收通知,管理應用程式必須註冊為暫時事件取用者。 註冊系統登錄提供者的大部分需求都與任何其他事件註冊相同,但您也必須執行下列程式。

登錄提供者會提供系統登錄中事件的事件類別。 如需一般事件註冊的詳細資訊,請參閱 接收 WMI 事件

下列程式說明如何註冊系統登錄事件。

註冊系統登錄事件

  1. 呼叫通知查詢方法。

    在腳本或 C++ 中,使用通知查詢,例如 SWbemServices.ExecNotificationQueryAsyncIWbemServices::ExecNotificationQueryAsync。 為IWbemServices::ExecNotificationQueryAsync或腳本中的strQuery,建立bstrQuery參數的查詢字串。

  2. 判斷您想要接收和建立查詢的事件種類。

    下表列出您可以使用的登錄事件類別。

    事件類別 Hive 位置 描述
    RegistryEvent N/A
    登錄中變更的抽象基類。
    RegistryTreeChangeEvent RootPath
    監視金鑰階層的變更。
    RegistryKeyChangeEvent KeyPath
    監視單一金鑰的變更。
    RegistryValueChangeEvent ValueName
    監視單一值的變更。

    這些類別具有稱為 Hive 的屬性,可識別要監視變更的索引鍵階層,例如 HKEY_LOCAL_MACHINE

    RegistryEvent或衍生自它的類別不支援對HKEY_CLASSES_ROOTHKEY_CURRENT_USER區所做的變更,例如RegistryTreeChangeEvent

  3. 建立事件註冊的 WHERE 子句。

    系統登錄提供者具有 WHERE 子句的特定規則。 如需詳細資訊,請參閱 建立登錄提供者的適當 WHERE 子句。 如需建立 WHERE 子句的詳細資訊,請參閱 使用 WQL 查詢

  4. 判斷您的取用者是否正在接收事件。

    系統登錄提供者不保證會傳遞所有傳送的事件。 如需詳細資訊,請參閱 接收登錄事件

下列 VBScript 程式碼範例示範如何偵測HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft Hive 或子樹狀結構中的登錄變更。 這是監視腳本,用於示範用途,會在名為 Wscript.exe 的進程中執行,直到在 任務管理器中終止、WMI 停止或作業系統重新開機為止。 腳本會使用SWbemServices.ExecNotificationQuery的半同步呼叫。 如需有關半同步呼叫的詳細資訊,請參閱 使用 VBScript 進行半同步呼叫

Set wmiServices = GetObject("winmgmts:root/default") 
Set colTreeChanges = wmiServices.ExecNotificationQuery _
    ("SELECT * FROM RegistryTreeChangeEvent " _
    & "WHERE Hive='HKEY_LOCAL_MACHINE' " _
    & "AND RootPath='SOFTWARE\\Microsoft'")

While (True)
   Set TreeChange = colTreeChanges.NextEvent
   TreeChange.GetObjectText_()
   Wscript.Echo  "Hive = " & TreeChange.Hive & VBNewLine _
      & "RootPath = "& TreeChange.RootPath _
      & TreeChange.GetObjectText_()      
Wend

下列 VBScript 程式碼範例示範如何登錄登錄提供者事件種類 RegistryKeyChangeEvent來監視機碼值的變化。 腳本會呼叫非同步方法 SWbemServices.ExecNotificationQueryAsync。 如需非同步呼叫和安全性的詳細資訊,請參閱 使用 VBScript 進行非同步呼叫

下列腳本會無限期執行,直到電腦重新開機、WMI 停止或腳本停止為止。 若要手動停止腳本,請使用工作管理員停止進程。 若要以程式設計方式停止它,請使用 Win32_Process 類別中的 Terminate 方法。

strComputer = "."
Set objWMIServices = GetObject("winmgmts:root/default") 
Set wmiSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink", "SINK_") 
Set ObjRegistry = GetObject("winmgmts:_
    {impersonationLevel = impersonate}!\\" _
    & strComputer & "\root\default:StdRegProv")

' Create a new key
strPath = "SOFTWARE\MyKey\MySubKey\"
Return = objRegistry.CreateKey(HKEY_LOCAL_MACHINE, strPath)

' Start listening for change in key
objWMIServices.ExecNotificationQueryAsync wmiSink, _ 
    "SELECT * FROM RegistryKeyChangeEvent " _ 
    & "WHERE Hive='HKEY_LOCAL_MACHINE' AND " _ 
    & "KeyPath='SOFTWARE\\MyKey\\MySubKey\\'" 
WScript.Echo "Listening for Registry Change Events..." 

While(True) 
    WScript.Sleep 1000
' You can use Regedit to make a change in the key 
' HKEY_LOCAL_MACHINE\SOFTWARE\MyKey\MySubKey\ 
'    to see an event generated.
Wend 

Sub SINK_OnObjectReady(EventObject, wmiAsyncContext) 
    WScript.Echo "Received Registry Change Event" & vbCrLf & _
      EventObject.GetObjectText_() 
End Sub