Aracılığıyla paylaş


İzleme Olayları

Sistem yöneticileri, bir ağdaki olayları izlemek için WMI kullanabilir. Örneğin:

  • Bir hizmet beklenmedik bir şekilde durdurulur.
  • Sunucu kullanılamaz duruma gelir.
  • Disk sürücüsü, %80% kapasitesine kadar dolar.
  • Güvenlik olayları bir NT Olay Günlüğü'ne bildirilir.

Bazı WMI sağlayıcıları olay sağlayıcısı olduğundan WMI olay algılamayı ve olay tüketicilerine teslimi destekler. Daha fazla bilgi için bkz. WMI Olayı alma.

Olay tüketicileri, olayların bildirimini isteyen ve belirli olaylar gerçekleştiğinde görevleri gerçekleştiren uygulamalar veya betiklerdir. Olaylar oluştuğunda geçici olarak izleyen olay izleme betikleri veya uygulamaları oluşturabilirsiniz. WMI ayrıca önceden yüklenmiş kalıcı olay sağlayıcıları ve kalıcı tüketici sınıflarından oluşan ve olayları kalıcı olarak izlemenizi sağlayan bir dizi sağlar. Daha fazla bilgi için bkz. İzleme ve Olaylara Standart Tüketicilerle Yanıt Verme.

Bu konuda aşağıdaki bölümler ele alınmıştır:

Geçici Olay Tüketicilerini Kullanma

Geçici olay tüketicileri, bir olay sorgusu veya filtresiyle eşleşen olayları döndüren betikler veya uygulamalardır. Geçici olay sorguları genellikle C++ uygulamalarında IWbemServices::ExecNotificationQuery veya betiklerde ve Visual Basic'te SWbemServices.ExecNotificationQuerykullanır.

Olay sorgusu, Win32_ProcessTrace veya RegistryKeyChangeEventgibi belirli bir olay türünü belirten bir olay sınıfının örneklerini ister.

Aşağıdaki VBScript kod örneği, bir Win32_ProcessTrace örneği oluşturulduğunda bildirim isteğinde bulunur. Bir işlem başlatıldığında veya durdurulduğunda bu sınıfın bir örneği oluşturulur.

Betiği yürütmek için event.vbs adlı bir dosyaya kopyalayın ve şu komut satırını kullanın: cscript event.vbs. Komut dosyasının çıktısını Notepad.exe veya başka bir işlemi başlatarak görebilirsiniz. Betik, beş işlem başlatıldıktan veya durdurulduktan sonra durur.

Bu betik, SWbemServices.ExecNotificationQueryyönteminin, yarı eşzamanlı olmayan versiyonunu çağırır. SWbemServices.ExecNotificationQueryAsyncçağrısını kullanarak asenkron geçici bir olay aboneliği ayarlamanın örneği için bir sonraki betiğe bakın. Daha fazla bilgi için bkz. Yöntem çağırma. Betik, her olayı geldikçe almak ve işlemek için SWbemEventSource.NextEvent çağırır. Betiği .vbs uzantısına sahip bir dosyaya kaydedin ve betiği CScript: cscript file.vbskullanarak komut satırında çalıştırın.

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

Geçici olay tüketicilerinin el ile başlatılması ve WMI yeniden başlatmaları veya işletim sistemi yeniden başlatmaları arasında kalıcı olmaması gerekir. Geçici bir olay tüketicisi yalnızca çalışırken olayları işleyebilir.

Aşağıdaki işlem, geçici bir olay tüketicisinin nasıl oluşturulacağını açıklar.

Geçici bir olay tüketicisi oluşturmak için

  1. Hangi programlama dilini kullanacağınıza karar verin.

    Kullanılacak API'yi programlama dili belirler.

    • C++ programlama dili için WMI içinCOM API'sini kullanın.
    • Visual Basic veya betik dilleri için Betik API'sini WMIile kullanın.
  2. Geçici bir olay tüketici uygulaması kodlamaya wmi uygulamasını başlattığınız gibi başlayın.

    Kodlamanın ilk adımları programlama diline bağlıdır. Genellikle WMI'de oturum açar ve güvenlik ayarlarını ayarlarsınız. Daha fazla bilgi için bakınız WMI Uygulaması veya Betiğinin Oluşturulması.

  3. Kullanmak istediğiniz olay sorgusunu tanımlayın.

    Bazı performans verileri türlerini elde etmek için yüksek performanslı sağlayıcılar tarafından sağlanan sınıfları kullanmanız gerekebilir. Daha fazla bilgi için bkz. İzleme Performans Verileri, Alınacak Olay Türünü Belirlemeve WQL ile Sorgulama.

  4. Zaman uyumsuz bir çağrı veya yarı zaman uyumsuz çağrı yapmaya karar verin ve API yöntemini seçin.

    Zaman uyumsuz çağrılar, veriler için yoklama ek yükünden kaçınmanıza olanak sağlar. Ancak, yarı eşzamanlı çağrılar daha fazla güvenlikle benzer bir performans sağlar. Daha fazla bilgi için bkz. Yöntem çağırma.

  5. Zaman uyumsuz veya yarı zaman uyumsuz yöntem çağrısı yapın ve strQuery parametresi olarak bir olay sorgusu ekleyin.

    C++ uygulamaları için aşağıdaki yöntemleri çağırın:

    Betikler için aşağıdaki yöntemleri çağırın:

  6. Döndürülen olay nesnesini işlemek için kodu yazın.

    Zaman uyumsuz olay sorguları için, kodu nesne havuzundaki çeşitli yöntemlere veya olaylara yerleştirin. Eş zamanlı olmayan olay sorguları için, WMI tarafından alınan her nesne geri döner, bu nedenle kod, her nesneyi işleyen döngüde olmalıdır.

Aşağıdaki betik kodu örneği, Win32_ProcessTrace betiğinin zaman uyumsuz bir sürümüdür. Eşzamansız işlemler hemen sonuç verdiğinden, bir iletişim kutusu betiği olayları beklerken etkin tutar.

Her olayı almak için SWbemEventSource.NextEvent çağırmak yerine, betikte SWbemSink OnObjectReady olayı için bir olay işleyicisi bulunur.

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

Not

SINK_OnObjectReady alt yordam tarafından işlenen geri çağırma gibi zaman uyumsuz bir geri çağırma, kimliği doğrulanmamış bir kullanıcının havuza veri sağlamasına izin verir. Daha iyi güvenlik için yarı zaman uyumlu iletişim veya zaman uyumlu iletişim kullanın. Daha fazla bilgi için aşağıdaki konulara bakın:

 

Kalıcı Olay Tüketicilerini Kullanma

Kaydı açıkça iptal edilene kadar kalıcı bir olay tüketicisi çalışır; daha sonra WMI veya sistem yeniden başlatıldığında tekrar başlatılır.

Kalıcı olay tüketicisi, sistemdeki WMI sınıflarının, filtrelerinin ve COM nesnelerinin birleşimidir.

Aşağıdaki liste, kalıcı bir olay tüketicisi oluşturmak için gereken bölümleri tanımlar:

  • Kalıcı tüketiciyi uygulayan kodu içeren bir COM nesnesi.
  • Yeni bir kalıcı tüketici sınıfı.
  • Kalıcı tüketici sınıfının bir örneği.
  • Olaylar için sorguyu içeren bir filtre.
  • Tüketici ile filtre arasındaki bağlantı.

Daha fazla bilgi için bkz. Her Zaman Olayların Alınması.

WMI birkaç kalıcı tüketici sağlar. Tüketici sınıfları ve kodu içeren COM nesnesi önceden yüklenmiştir. Örneğin, ActiveScriptEventConsumer sınıfının bir örneğini oluşturup yapılandırarak bir olay oluştuğunda betik çalıştırabilirsiniz. Daha fazla bilgi için bkz. Standart Tüketicilerle Olayları İzleme ve Yanıtlama. ActiveScriptEventConsumerkullanımıyla ilgili bir örnek için, bkz. Bir Olay Üzerine Betik Çalıştırma.

Aşağıdaki yordamda kalıcı bir olay tüketicisinin nasıl oluşturulacağı açıklanmaktadır.

Kalıcı bir olay tüketicisi oluşturmak için

  1. Olay sağlayıcısı kullandığınız ad alanına kaydedin.

    Bazı olay sağlayıcıları yalnızca belirli bir ad alanını kullanabilir. Örneğin, __InstanceCreationEventWin32 sağlayıcısı tarafından desteklenen ve varsayılan olarak \root\cimv2 ad alanına kaydedilen iç olaydır.

    Not

    Farklı ad alanları arasında bir abonelik oluşturmak için kayıtta kullanılan __EventFilter'in EventNamespace özelliğini kullanabilirsiniz. Daha fazla bilgi için bkz. Çapraz Ad Alanları Arası Kalıcı Olay Aboneliklerini Uygulama.

     

  2. Olay tüketici sağlayıcısını olay sınıflarının yer aldığı ad alanında kaydedin.

    WMI, kalıcı bir olay tüketicisi bulmak için bir olay tüketici sağlayıcısı kullanır. Kalıcı olay tüketicisi, bir olay alındığında WMI'nin başlattığı uygulamadır. Sağlayıcılar, olay tüketicisini kaydetmek için __EventConsumerProviderRegistrationörnekleri oluşturur.

  3. Kullanmak istediğiniz kalıcı olay tüketicisini temsil eden sınıfının bir örneğini oluşturun.

    Olay tüketici sınıfları __EventConsumersınıfından türetilir. Olay tüketici örneğinin gerektirdiği özellikleri ayarlayın.

  4. regsvr32 yardımcı programını kullanarak tüketiciyi COM'a kaydedin.

  5. __EventFilterolay filtresi sınıfının bir örneğini oluşturun.

    Olay filtresi örneği için gerekli alanları ayarlayın. __EventFilter için gerekli alanlar Name, QueryLanguageve Query'dır. Name özelliği, bu sınıfın bir örneği için herhangi bir benzersiz ad olabilir. QueryLanguage özelliği her zaman "WQL" olarak ayarlanır. Query özelliği, olay sorgusu içeren bir dizedir. Kalıcı bir olay tüketicisinin sorgusu başarısız olduğunda bir olay tetiklenir. Olayın kaynağı WinMgmt, olay kimliği 10 ve olay türü Hata'dır.

  6. Mantıksal olay tüketicisini bir olay filtresiyle ilişkilendirmek için __FilterToConsumerBinding sınıfının bir örneğini oluşturun.

    WMI, olay filtresinde belirtilen ölçütlerle eşleşen olayla ilişkili olay tüketicisini bulmak için bir ilişkilendirme kullanır. WMI, başlatacak kalıcı olay tüketici uygulamasını bulmak için olay tüketici sağlayıcısını kullanır.