註冊系統登錄事件
若要從 系統登錄 提供者接收通知,管理應用程式必須註冊為暫時事件取用者。 註冊系統登錄提供者的大部分需求都與任何其他事件註冊相同,但您也必須執行下列程式。
登錄提供者會提供系統登錄中事件的事件類別。 如需一般事件註冊的詳細資訊,請參閱 接收 WMI 事件。
下列程式說明如何註冊系統登錄事件。
註冊系統登錄事件
呼叫通知查詢方法。
在腳本或 C++ 中,使用通知查詢,例如 SWbemServices.ExecNotificationQueryAsync 或 IWbemServices::ExecNotificationQueryAsync。 為IWbemServices::ExecNotificationQueryAsync或腳本中的strQuery,建立bstrQuery參數的查詢字串。
判斷您想要接收和建立查詢的事件種類。
下表列出您可以使用的登錄事件類別。
事件類別 Hive 位置 描述 RegistryEvent N/A 登錄中變更的抽象基類。 RegistryTreeChangeEvent RootPath 監視金鑰階層的變更。 RegistryKeyChangeEvent KeyPath 監視單一金鑰的變更。 RegistryValueChangeEvent ValueName 監視單一值的變更。 這些類別具有稱為 Hive 的屬性,可識別要監視變更的索引鍵階層,例如 HKEY_LOCAL_MACHINE。
RegistryEvent或衍生自它的類別不支援對HKEY_CLASSES_ROOT和HKEY_CURRENT_USER區所做的變更,例如RegistryTreeChangeEvent。
建立事件註冊的 WHERE 子句。
系統登錄提供者具有 WHERE 子句的特定規則。 如需詳細資訊,請參閱 建立登錄提供者的適當 WHERE 子句。 如需建立 WHERE 子句的詳細資訊,請參閱 使用 WQL 查詢。
判斷您的取用者是否正在接收事件。
系統登錄提供者不保證會傳遞所有傳送的事件。 如需詳細資訊,請參閱 接收登錄事件。
下列 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