Otrzymywanie synchronicznych i półsynchronicznych powiadomień o zdarzeniach
Użyj SWbemServices.ExecQuery, aby zażądać wszystkich istniejących zdarzeń.
Poniższy przykład kodu przedstawia sposób wykonywania zapytań dotyczących zdarzeń w dzienniku.
Select * from Win32_NTLogEvent
Aby uzyskać więcej informacji, zobacz Określanie typu zdarzenia do odbierania, odbierania powiadomień o zdarzeniachi WQL (SQL for WMI).
Domyślne wywołanie polecenia SWbemServices.ExecNotificationQuery używa komunikacji semisynchronicznej. Parametr iflags ma flagi wbemFlagForwardOnly i wbemFlagReturnImmediately ustawione domyślnie. Aby uzyskać więcej informacji, zobacz Wywoływanie metody.
Poniższa procedura opisuje sposób odbierania powiadomienia o zdarzeniach półsynchronicznych przy użyciu języka VBScript.
Aby otrzymywać powiadomienie o zdarzeniach półsynchronicznych w języku VBScript
Utwórz zapytanie dotyczące typu zdarzenia, które chcesz odebrać. Aby uzyskać więcej informacji, zobacz Określanie typu zdarzenia do odbioru.
Jeśli zażądasz typu wystąpienia zdarzenia, takiego jak __InstanceCreationEvent, wskaż w zapytaniu typ wystąpienia docelowego, na przykład Win32_LogicalDisk.
W razie potrzeby określ wystąpienie, na przykład nazwę przestrzeni nazw podczas żądania przyszłych wystąpień __NamespaceModificationEvent dla określonej przestrzeni nazw.
Określ interwał sondowania instrumentacji zarządzania Windows (WMI) w zapytaniu, na przykład "W RAMACH 10", aby sondować co 10 sekund. Aby uzyskać więcej informacji, zobacz WITHIN Clause.
Wywołaj SWbemServices.ExecNotificationQuery przy użyciu zapytania.
Przejdź przez kolekcję, którą otrzymasz.
W poniższym przykładzie pokazano, jak monitorować wstawianie i usuwanie dysków z dyskietki na komputerze lokalnym. Skrypt żąda ___InstanceModificationEvent wystąpień dla stacji dyskietek Win32_LogicalDisk i skanuje co 10 sekund, aby znaleźć nowe wystąpienia. Ten skrypt jest przykładem tymczasowego odbiorcy zdarzeń i kontynuuje działanie, dopóki nie zostanie zatrzymany w Menedżerze zadań lub system zostanie uruchomiony ponownie. Aby uzyskać więcej informacji, zobacz Odbieranie zdarzeń dla czasu trwania aplikacji.
Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
("Select * from __InstanceModificationEvent within 10 WHERE " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
Set strDiskChange = colMonitoredDisks.NextEvent
If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
If strDiskChange.TargetInstance.Size > 0 Then
Wscript.Echo "A disk has been inserted" & _
" into the floppy drive."
Else
Wscript.Echo "A disk has been removed" & _
" from the floppy drive."
End If
End If
Loop
Poniższa procedura opisuje sposób odbierania powiadomienia o zdarzeniach częściowosynchronicznych przy użyciu języka C++.
Aby otrzymywać powiadomienie o zdarzeniach półsynchronicznych w języku C++
Skonfiguruj aplikację przy użyciu wywołań funkcji CoInitializeEx i CoInitializeSecurity.
Ponieważ usługa WMI jest oparta na modelu COM, wywoływanie CoInitializeEx i CoInitializeSecurity jest koniecznym krokiem dla aplikacji WMI. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji WMI lub skryptu.
Określ rodzaj zdarzeń, które chcesz otrzymywać.
Usługa WMI obsługuje zdarzenia wewnętrzne i zewnętrzne. Zdarzenie wewnętrzne jest zdarzeniem wstępnie zdefiniowanym przez WMI. Zdarzenie zewnętrzne to zdarzenie zdefiniowane przez dostawcę innej firmy. Aby uzyskać więcej informacji, zobacz Określanie typu zdarzenia do odbioru.
Zarejestruj się, aby odebrać określoną klasę zdarzeń za pomocą wywołania metody IWbemServices::ExecNotificationQuery.
Ustaw każde zapytanie jako bardzo specyficzne. Celem rejestracji jest zarejestrowanie się w celu otrzymywania tylko wymaganych powiadomień. Powiadomienia, które nie są wymagane, marnują czas na przetwarzanie i dostawę.
Możesz zaprojektować odbiorcę zdarzeń w celu odbierania wielu zdarzeń. Na przykład użytkownik może wymagać powiadomienia o zdarzeniach modyfikacji wystąpienia dla określonej klasy urządzeń oraz zdarzeniach naruszenia zabezpieczeń. W tym przypadku zadania, które wykonuje konsument podczas odbierania zdarzenia modyfikacji wystąpienia, są inne dla tych dwóch zdarzeń. W związku z tym konsument powinien wykonać jedno wywołanie IWbemServices::ExecNotificationQuery, aby zarejestrować się na zdarzenia modyfikacji wystąpienia, oraz drugie wywołanie ExecNotificationQuery, aby zarejestrować się na zdarzenia naruszenia zabezpieczeń.
W wywołaniu ExecNotificationQuery, ustaw parametr lFlags na WBEM_FLAG_RETURN_IMMEDIATELY oraz WBEM_FLAG_FORWARD_ONLY. Flaga WBEM_FLAG_RETURN_IMMEDIATELY żąda przetwarzania semisynchronicznego, a flaga WBEM_FLAG_FORWARD_ONLY żąda enumeratora wysyłającego tylko do przodu. Aby uzyskać więcej informacji, zobacz Wywoływanie metody. Funkcja ExecNotificationQuery zwraca wskaźnik do interfejsu IEnumWbemClassObject.
Sonduj powiadomienia o zarejestrowanych zdarzeniach, wykonując powtarzające się wywołania metody IEnumWbemClassObject::Next.
Po zakończeniu zwolnij enumerator wskazujący na obiekt IEnumWbemClassObject.
Możesz uwolnić wskaźnik IWbemServices skojarzony z rejestracją. Zwolnienie wskaźnika IWbemServices powoduje, że WMI przestaje dostarczać zdarzenia wszystkim tymczasowym konsumentom powiązanym z usługą.