Ta emot en WMI-händelse
WMI innehåller en händelseinfrastruktur som skapar meddelanden om ändringar i WMI-data och -tjänster. WMI händelseklasser meddelar när specifika händelser inträffar.
Följande avsnitt beskrivs i det här avsnittet:
- händelsefrågor
- Exempel
- Händelsekonsumenter
- Tillhandahålla Evenemang
- prenumerationskvoter
- Relaterade ämnen
Händelsefrågor
Du kan skapa en semisynkron eller asynkron fråga för att övervaka ändringar i händelseloggar, processskapande, tjänststatus, datortillgänglighet eller ledigt diskutrymme samt andra entiteter eller händelser. I skript används metoden SWbemServices.ExecNotificationQuery för att prenumerera på händelser. I C++används IWbemServices::ExecNotificationQuery. För mer information, se Anropa en metod.
Meddelande om en ändring i WMI-standarddatamodellen kallas för en inbyggd händelse. __InstanceCreationEvent eller __NamespaceDeletionEvent är exempel på inbyggda händelser. Meddelande om en ändring som en tjänsteleverantör gör för att definiera en providerhändelse kallas för en extern händelse. Till exempel System Registry Provider, Power Management Event Provideroch Win32 Provider definierar sina egna händelser. Mer information finns i Fastställa vilken typ av händelse som ska ta emot.
Exempel
Följande skriptkodexempel är en fråga för den inbyggda __InstanceCreationEvent för händelseklassen Win32_NTLogEvent. Du kan köra det här programmet i bakgrunden och när det finns en händelse visas ett meddelande. Om du stänger dialogrutan Väntar på händelser slutar programmet att vänta på händelser. Tänk på att SeSecurityPrivilege- måste vara aktiverad.
Sub SINK_OnObjectReady(objObject, objAsyncContext)
WScript.Echo (objObject.TargetInstance.Message)
End Sub
Set objWMIServices = GetObject( _
"WinMgmts:{impersonationLevel=impersonate, (security)}")
' Create the event sink object that receives the events
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
' Set up the event selection. SINK_OnObjectReady is called when
' a Win32_NTLogEvent event occurs
objWMIServices.ExecNotificationQueryAsync sink,"SELECT * FROM __InstanceCreationEvent " & "WHERE TargetInstance ISA 'Win32_NTLogEvent' "
WScript.Echo "Waiting for events"
# Define event Query
$query = "SELECT * FROM __InstanceCreationEvent
WHERE TargetInstance ISA 'Win32_NTLogEvent' "
<# Register for event - also specify an action that
displays the log event when the event fires.#>
Register-WmiEvent -Source Demo1 -Query $query -Action {
Write-Host "Log Event occured"
$global:myevent = $event
Write-Host "EVENT MESSAGE"
Write-Host $event.SourceEventArgs.NewEvent.TargetInstance.Message}
<# So wait #>
"Waiting for events"
Följande VBScript-kodexempel visar den utökningshändelse __RegistryValueChangeEvent som registerprovidern definierar. Skriptet skapar en tillfällig konsument med hjälp av anropet till SWbemServices.ExecNotificationQueryAsyncoch tar bara emot händelser när skriptet körs. Följande skript körs på obestämd tid tills datorn startas om, WMI stoppas eller skriptet stoppas. Om du vill stoppa skriptet manuellt använder du Aktivitetshanteraren för att stoppa processen. Om du vill stoppa den programmatiskt använder du metoden Avsluta i klassen Win32_Process. Mer information finns i Ställa in säkerhet på ett asynkront anrop.
strComputer = "."
Set objWMIServices=GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")
set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIServices.ExecNotificationQueryAsync objSink, _
"Select * from RegistryValueChangeEvent Where Hive = 'HKEY_LOCAL_MACHINE' and KeyPath = 'SYSTEM\\ControlSet001\\Control' and ValueName = 'CurrentUser'"
WScript.Echo "Waiting for events..."
While (True)
WScript.Sleep (1000)
Wend
WScript.Echo "Listening for Registry Change Events..." & vbCrLf
While(True)
WScript.Sleep 1000
Wend
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
WScript.Echo "Received Registry Value Change Event" & vbCrLf & wmiObject.GetObjectText_()
End Sub
Händelsekonsumenter
Du kan övervaka eller hantera händelser med hjälp av följande konsumenter medan ett skript eller ett program körs.
Tillfälliga händelsekonsumenter
En tillfällig konsument är ett WMI-klientprogram som tar emot en WMI-händelse. WMI innehåller ett unikt gränssnitt som används för att ange de händelser som WMI ska skicka till ett klientprogram. En tillfällig händelsekonsument anses vara tillfällig eftersom den endast fungerar när den laddas specifikt av en användare. Mer information finns i Mottagning av händelser under applikationens varaktighet.
Konsumenter av permanenta evenemang
En permanent konsument är ett COM-objekt som alltid kan ta emot en WMI-händelse. Den permanenta händelsekonsumenten använder en uppsättning beständiga objekt och filter för att fånga en WMI-händelse. Precis som en tillfällig händelsekonsument konfigurerar du en serie WMI-objekt och filter som avbildar en WMI-händelse. När en händelse inträffar som matchar ett filter laddar WMI den permanenta händelsekonsumenten och underrättar den om händelsen. Eftersom en permanent konsument implementeras i WMI-lagringsplatsen och är en körbar fil som är registrerad i WMI, fungerar och tar den permanenta händelsekonsumenten emot händelser efter att den har skapats och även efter en omstart av operativsystemet så länge WMI körs. Mer information finns i Ta emot händelser hela tiden.
Skript eller program som tar emot händelser har särskilda säkerhetsöverväganden. Mer information finns i Skydda WMI-händelser.
Ett program eller skript kan använda en inbyggd WMI-händelseleverantör som tillhandahåller standardkonsumentklasser. Varje standardkonsumentklass svarar på en händelse med en annan åtgärd genom att skicka ett e-postmeddelande eller köra ett skript. Du behöver inte skriva någon leverantörskod för att använda en standardklass av konsumenter för att skapa en permanent händelsekonsument. För mer information, se Övervakning och svar på händelser med standardkonsumenter.
Erbjuda evenemang
En händelseprovider är en COM-komponent som skickar en händelse till WMI. Du kan skapa en händelseprovider för att skicka en händelse i ett C++ eller C#-program. De flesta händelseprovidrar hanterar ett objekt för WMI, till exempel ett program eller maskinvaruobjekt. För mer information, se Skriva en händelseleverantör.
En tidsbestämd eller upprepande händelse är en händelse som inträffar vid en förutbestämd tidpunkt.
WMI tillhandahåller följande sätt att skapa tidsinställda eller upprepade händelser för dina applikationer:
- Microsofts standardinfrastruktur för händelser.
- En specialiserad timerklass.
Mer information finns i Mottagning av en tidpunktsbaserad eller upprepande händelse. När du skriver en händelseleverantör bör du överväga den säkerhetsinformation som identifierats i Tillhandahålla händelser på ett säkert sätt.
Vi rekommenderar att permanenta händelseprenumerationer kompileras till namnområdet \root\subscription. Mer information finns i Implementering av permanenta händelseprenumerationer över flera namnområden.
Prenumerationskvoter
Sökning efter händelser kan försämra prestanda för leverantörer som stöder frågor över stora datamängder. Dessutom kan alla användare som har läsbehörighet till ett namnområde med dynamiska leverantörer utföra en DoS-attack (Denial of Service). WMI upprätthåller kvoter för alla användare tillsammans och för varje händelsekonsument i den enda instansen av __ArbitratorConfiguration som finns i \root-namnrymd. Dessa kvoter är globala snarare än för varje namnområde. Du kan inte ändra kvoterna.
WMI tillämpar för närvarande kvoter med hjälp av egenskaperna för __ArbitratorConfiguration. Varje kvot har en per användare och en total version som innehåller alla användare tillsammans, inte per namnområde. I följande tabell visas de kvoter som gäller för __ArbitratorConfiguration egenskaper.
Totalt/PerUser | Kvot |
---|---|
Totalt antal tillfälliga prenumerationer Tillfälliga prenumerationer per användare |
10 000 1,000 |
Totalt antal permanenta prenumerationer PermanentaPrenumerationerPerAnvändare |
10 000 1,000 |
Sammanställning av Röstanvisningar Anvisningar för omröstning per användare |
10 000 1,000 |
PollingMemoryTotal PollningMinnePerAnvändare |
10 000 000 (0x989680) byte 5 000 000 (0x4CB40) byte |
En administratör eller en användare med FULL_WRITE behörighet inom namnområdet kan ändra singleton-instansen av __ArbitratorConfiguration. WMI spårar kvoten per användare.