Udostępnij za pośrednictwem


Monitorowanie zdarzeń

Administratorzy systemu mogą używać usługi WMI do monitorowania zdarzeń w sieci. Na przykład:

  • Usługa zostaje nieoczekiwanie zatrzymana.
  • Serwer staje się niedostępny.
  • Dysk wypełnia 80% pojemności.
  • Zdarzenia zabezpieczeń są zgłaszane do dziennika zdarzeń NT.

Usługa WMI obsługuje wykrywanie zdarzeń i dostarczanie do użytkowników zdarzeń, ponieważ niektórzy dostawcy usługi WMI są dostawcami zdarzeń. Aby uzyskać więcej informacji, zobacz Odbieranie zdarzenia WMI.

Odbiorcy zdarzeń to aplikacje lub skrypty, które żądają powiadomień o zdarzeniach, a następnie wykonują zadania, gdy wystąpią określone zdarzenia. Możesz utworzyć skrypty monitorowania zdarzeń lub aplikacje, które tymczasowo monitorują, kiedy wystąpią zdarzenia. Usługa WMI udostępnia również zestaw wstępnie zainstalowanych stałych dostawców zdarzeń i trwałych klas odbiorców, które umożliwiają trwałe monitorowanie zdarzeń. Aby uzyskać więcej informacji, zobacz Monitorowanie i reagowanie na zdarzenia za pomocą standardowych odbiorców.

W tym temacie omówiono następujące sekcje:

Używanie tymczasowych odbiorców zdarzeń

Odbiorcy zdarzeń tymczasowych to skrypty lub aplikacje, które zwracają zdarzenia zgodne z zapytaniem lub filtrem zdarzenia. Zapytania o zdarzenia tymczasowe zwykle używają IWbemServices::ExecNotificationQuery w aplikacjach języka C++ lub SWbemServices.ExecNotificationQuery w skryptach i Visual Basic.

Zapytanie o zdarzenie żąda wystąpień klasy zdarzeń, która określa określony typ zdarzenia, takie jak Win32_ProcessTrace lub RegistryKeyChangeEvent.

Poniższy przykładowy kod VBScript żąda powiadomienia po utworzeniu wystąpienia Win32_ProcessTrace. Wystąpienie tej klasy jest generowane po uruchomieniu lub zatrzymaniu procesu.

Aby wykonać skrypt, skopiuj go do pliku o nazwie event.vbs i użyj następującego wiersza polecenia: cscript event.vbs. Dane wyjściowe skryptu można wyświetlić, uruchamiając Notepad.exe lub inny proces. Skrypt zatrzymuje się po rozpoczęciu lub zatrzymaniu pięciu procesów.

Ten skrypt wywołuje SWbemServices.ExecNotificationQuery, czyli wersja metody semisynchroniczna. Zobacz następny skrypt, aby zapoznać się z przykładem konfigurowania asynchronicznej tymczasowej subskrypcji zdarzeń, wywołując SWbemServices.ExecNotificationQueryAsync. Aby uzyskać więcej informacji, zobacz sekcję Wywoływanie metody. Skrypt wywołuje SWbemEventSource.NextEvent w celu uzyskania i przetworzenia każdego zdarzenia w momencie jego nadejścia. Zapisz skrypt w pliku z rozszerzeniem vbs i uruchom skrypt w wierszu polecenia przy użyciu języka CScript: cscript file.vbs.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

Użytkownicy zdarzeń tymczasowych muszą być uruchamiani ręcznie i nie mogą być utrwalani podczas ponownego uruchamiania usługi WMI lub ponownego uruchamiania systemu operacyjnego. Tymczasowy odbiorca zdarzeń może przetwarzać zdarzenia tylko wtedy, gdy jest uruchomiony.

Poniższa procedura opisuje, jak utworzyć tymczasowego odbiorcę zdarzeń.

Aby utworzyć tymczasowego konsumenta zdarzenia

  1. Zdecyduj, który język programowania ma być używany.

    Język programowania określa interfejs API do użycia.

    • W przypadku języka programowania C++ użyj interfejsu API COM dla usługi WMI.
    • W przypadku języka Visual Basic lub języków skryptowych użyj API skryptów dla usługi WMI.
  2. Rozpocznij kodowanie tymczasowej aplikacji odbiorcy zdarzeń w taki sam sposób, w jaki rozpoczynasz kodowanie aplikacji opartej na WMI.

    Pierwsze kroki kodowania zależą od języka programowania. Zazwyczaj logujesz się do usługi WMI i konfigurujesz ustawienia zabezpieczeń. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji WMI lub skryptu.

  3. Zdefiniuj zapytanie o zdarzenie, którego chcesz użyć.

    Aby uzyskać niektóre typy danych wydajności, może być konieczne użycie klas udostępnianych przez dostawców o wysokiej wydajności. Aby uzyskać więcej informacji, zobacz Monitorowanie Danych Wydajności, Określanie Typu Zdarzenia Do Odbieraniai Wykonywanie Zapytania Za Pomocą WQL.

  4. Zdecyduj się na wywołanie asynchroniczne lub wywołanie semisynchroniczne i wybierz metodę interfejsu API.

    Wywołania asynchroniczne pozwalają uniknąć narzutów związanych z odpytywaniem danych. Jednak wywołania semisynchroniczne zapewniają podobną wydajność z większym poziomem bezpieczeństwa. Aby uzyskać więcej informacji, zobacz Wywoływanie metody.

  5. Utwórz wywołanie metody asynchronicznej lub semisynchronicznej i dołącz zapytanie o zdarzenie jako parametr strQuery.

    W przypadku aplikacji języka C++ wywołaj następujące metody:

    W przypadku skryptów wywołaj następujące metody:

  6. Napisz kod, aby przetworzyć zwrócony obiekt zdarzenia.

    W przypadku zapytań dotyczących zdarzeń asynchronicznych umieść kod w odpowiednich metodach lub zdarzeniach odbiornika obiektu. W przypadku zapytań dotyczących zdarzeń semisynchronicznych każdy obiekt jest zwracany w miarę uzyskiwania go przez usługę WMI, więc kod powinien znajdować się w pętli obsługującej każdy obiekt.

Poniższy przykład kodu skryptu jest asynchroniczną wersją skryptu Win32_ProcessTrace. Ponieważ operacje asynchroniczne wykonują się natychmiast, okno dialogowe utrzymuje skrypt aktywny podczas oczekiwania na zdarzenia.

Zamiast wywoływać SWbemEventSource.NextEvent w celu odbierania każdego zdarzenia, skrypt zawiera procedurę obsługi zdarzeń dla zdarzenia SWbemSink OnObjectReady.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

Notatka

Asynchroniczne wywołanie zwrotne, takie jak wywołanie zwrotne obsługiwane przez SINK_OnObjectReady podroutine, umożliwia użytkownikowi nieuwierzytelnionemu dostarczanie danych do ujścia. Aby uzyskać lepsze zabezpieczenia, należy użyć komunikacji częściowosynchronicznej lub synchronicznej komunikacji. Aby uzyskać więcej informacji, zobacz następujące tematy:

 

Używanie stałych odbiorców zdarzeń

Trwały odbiorca zdarzeń jest uruchamiany do momentu jawnego anulowania rejestracji, a następnie uruchamia się po ponownym uruchomieniu usługi WMI lub systemu.

Trwały odbiorca zdarzeń to kombinacja klas WMI, filtrów i obiektów COM w systemie.

Poniższa lista identyfikuje części wymagane do utworzenia trwałego odbiorcy zdarzeń:

  • Obiekt COM zawierający kod, który implementuje stałego konsumenta.
  • Nowa stała klasa konsumenta.
  • Instancja trwałej klasy konsumenta.
  • Filtr zawierający zapytanie dotyczące zdarzeń.
  • Łącze między odbiorcą a filtrem.

Aby uzyskać więcej informacji, zobacz Odbieranie zdarzeń w dowolnym momencie.

WMI dostarcza kilku stałych konsumentów. Klasy konsumentów i obiekt COM zawierający kod są wstępnie zainstalowane. Można na przykład utworzyć i skonfigurować wystąpienie klasy ActiveScriptEventConsumer w celu uruchomienia skryptu w przypadku wystąpienia zdarzenia. Aby uzyskać więcej informacji, zobacz Monitorowanie i Reagowanie na Zdarzenia za pomocą Standardowych Odbiorców. Aby zapoznać się z przykładem użycia ActiveScriptEventConsumer, zobacz Uruchomienie skryptu w oparciu o zdarzenie.

W poniższej procedurze opisano sposób tworzenia trwałego odbiorcy zdarzeń.

Aby utworzyć trwałego konsumenta zdarzeń

  1. Zarejestruj dostawcę zdarzeń w używanej przestrzeni nazw.

    Niektórzy dostawcy zdarzeń mogą używać tylko określonej przestrzeni nazw. Na przykład __InstanceCreationEvent jest zdarzeniem wewnętrznym obsługiwanym przez dostawcę Win32 i jest domyślnie rejestrowane w przestrzeni nazw \root\cimv2.

    Notatka

    Możesz użyć właściwości EventNamespace obiektu __EventFilter wykorzystywanego w rejestracji do utworzenia subskrypcji obejmującej różne przestrzenie nazw. Aby uzyskać więcej informacji, zobacz Implementowanie trwałych subskrypcji zdarzeń między przestrzeniami nazw.

     

  2. Zarejestruj dostawcę usługi dla odbiorców zdarzeń w przestrzeni nazw, w której znajdują się klasy zdarzeń.

    Usługa WMI używa dostawcy odbiorców zdarzeń do znalezienia odbiorcy zdarzeń, który jest trwały. Trwały odbiorca zdarzeń to aplikacja, którą uruchamia WMI po odebraniu zdarzenia. Aby zarejestrować odbiorcę zdarzeń, dostawcy tworzą wystąpienia __EventConsumerProviderRegistration.

  3. Utwórz wystąpienie klasy reprezentującej stałego konsumenta zdarzeń, którego chcesz użyć.

    Klasy odbiorców zdarzeń pochodzą z klasy __EventConsumer. Skonfiguruj właściwości potrzebne dla instancji odbiorcy zdarzeń.

  4. Zarejestruj użytkownika w COM przy użyciu narzędzia regsvr32.

  5. Utwórz wystąpienie klasy filtra zdarzeń __EventFilter.

    Ustaw wymagane elementy dla wystąpienia filtra zdarzeń. Wymagane pola dla __EventFilter to Nazwa, Język zapytańi Zapytywanie. Właściwość Name może być dowolną unikatową nazwą wystąpienia tej klasy. Właściwość QueryLanguage jest zawsze ustawiona na wartość "WQL". Właściwość Query jest ciągiem zawierającym zapytanie o zdarzenie. Zdarzenie jest generowane, gdy zapytanie użytkownika zdarzenia trwałego kończy się niepowodzeniem. Źródłem zdarzenia jest WinMgmt, identyfikator zdarzenia to 10, a typ zdarzenia to Błąd.

  6. Utwórz wystąpienie klasy __FilterToConsumerBinding, aby skojarzyć konsumenta zdarzeń logicznych z filtrem zdarzeń.

    WMI używa skojarzenia, aby znaleźć konsumenta zdarzeń powiązanego ze zdarzeniem, które spełnia kryteria określone w filtrze zdarzeń. Usługa WMI używa dostawcy odbiorców zdarzeń, aby znaleźć trwałą aplikację odbiorcy zdarzeń do uruchomienia.