5

Performans İzleyicisi'nde (Windows Server 2008 R2), İşlemci (_Total) \% İşlemci Süresi 10'un üzerinde olduğunda tetiklenmesi gereken bir uyarı oluşturdum. uyarının gönderilmesi koşulu her zaman karşılanmaktadır). Görüntüdeki Uyarı Görevi özelliklerini görebilirsiniz.PowerShell betiğini kullanarak Performans İzleyicisi'nden e-posta uyarısı gönder

enter image description here

Buna ek olarak, ben de kullanıcı veya olmasın açmış olup olmadığını çalışacaktır Görev Zamanlayıcı yeni bir görev oluşturduk ve en yüksek ayrıcalıklarla çalışır.

  • Ayarlar bir olayda::

    • görevi başlayın: Temel
    • Giriş: Bu görev için tetikleyici aşağıdaki özelliklere sahiptir Sistemi
    • Kaynak: İşlemci

    Eylemler (ve bu doğru olup olmadığını bilmiyorum kısmıdır) aşağıdaki ayarları vardır:

    • Eylem: Bir program başlatın
    • Program/script: PowerShell betiğinin bir e-posta göndermek için yolu.

    PowerShell kodu ($, değer yukarıdaki resimde olduğu gibi, uyarı görev özellikleri ayarlamak performans izleyicisi veri toplayıcı gelmesi gerekiyor $ isim, $ tarih $, sayaç, $ eşiği) şudur:

    function SendMail ($name, $date, $counter, $threshold, $value) { 
        $MailMessage = New-Object Net.Mail.MailMessage 
        $MailMessage.To.Add("[email protected]") 
        $MailMessage.From = "[email protected]" 
        $MailMessage.Subject = "ALERT - Performance Monitor" 
        $MailMessage.IsBodyHtml = $True 
    
        $MailMessage.Body = @" 
        <html><head></head><body> 
        The following counter needs attention:<BR><BR> 
        Name: $($name)<BR> 
        Date: $($date)<BR> 
        Counter: $($counter)<BR> 
        Threshold: $($threshold)<BR> 
        Actual Value: $($value)<BR> 
        <FONT face=Courier>$($html)</FONT> 
        <BR> 
        --- Automatically generated with SENDMAIL function --- 
        </body> 
        </html> 
    "@ 
    
        $SmtpClient = New-Object Net.Mail.SmtpClient("blah.bleh") 
        $SmtpClient.Send($MailMessage) 
    } 
    

    Görev başlatıldıktan sonra, aşağıda Geçmişi görüyorum: Görev Başladı, Eylem Başladı ve Oluşturuldu Sor Sürümü. E-posta asla gönderilmemiştir.

    Eylemi kullanarak bir e-posta göndermeyi denedim: E-posta gönder, ve iyi çalıştı. Neyin yanlış olabileceğini bilen var mı?

  • +0

    Tüm parametrelerin komut dosyasında doğru şekilde geçtiğinden emin misiniz? Başka bir şey, eğer powershell v3 kullanıyorsanız, o zaman sen-mailmessage cmdlet -http kullanabilirsiniz: //stackoverflow.com/a/17456077/581922 – Mitul

    +0

    @Mitul: $ name, $ date, etc parametrelerini mi kastediyorsunuz? Eğer öyleyse, nasıl kontrol edebilirim? E-posta, smtp sunucusu vb. Gibi parametreye atıfta bulunuyorsanız, Eylemde kullandığım gibi kullanıyorum: E-posta gönder (komut dosyasında smtp sunucumun "SMTP" ile başlaması arasındaki fark). (Ve maalesef, v3 kullanmıyorum :( – Anna

    +0

    Gönderdiğiniz kod bir işlevi tanımlar, ancak bu işlevi her yerde aradığınızı görmüyorum. –

    cevap

    8

    Temel olarak, bu işi sizin için yapmanız gereken iki şey vardır.

    1. Betiğinize doğru olarak iletilen uyarı parametrelerini alın.
    2. Aslında betiğinizde tanımlanan işlevi çağırın.

    Parametrelerle başlayacağız. (Yukarıdaki resim) sizin uyarının Uyarısı Görev sekmesinde, Görev Argümanlar alanını düzenlemek ve değiştirin:

    {name}{date}{counter}{threshold}{value} 
    

    ile:

    "{name}" "{date}" "{counter}" "{threshold}" "{value}" 
    

    Parametreleriniz temelde bir boşlukla ayrılmış dize değeri olarak çözümlenen ediliyor Bu nedenle, boşluk içeren değerlerin üstesinden gelmek için her bir parametre belirtecinin etrafında çift tırnak ekliyoruz ve her parametre parametresinin arasına bir boşluk ekliyoruz, böylece bir parametreyi diğerinden anlatabileceğiz. Daha sonra, zamanlanmış görevinizin ("İşlemci İzleme" adlı) eylemi için uyarıdan parametreler beklemesini ve bu parametreleri PowerShell komut dosyasına iletmesini söylemelisiniz.

    enter image description here

    Sizin Aksiyon, yani "bir program başlat" doğrudur. Program/script alanında, "PowerShell.EXE" girin (veya tam yolu için göz) için

    .

    Ve Ekleme Argümanlar alan için

    , bu girin:

    perfmon_send_email.ps1 yukarıda açıklanan şekilde SendMail() işlevi içeren komut dosyası
    -File C:\path\to\your\PowerShell\scripts\perfmon_send_email.ps1 $(Arg0) 
    

    .

    Bu bit biraz takıntılıydı, bu nedenle bunu ayarlamak için başka yollar da olabilir, ancak -File parametresini açıkça kullanarak testlerimde fark yarattım. Zamanlanmış görev, komut dosyasını çalıştırmak için PowerShell'i çalıştırdığında, $(Arg0) bölümü, Uyarıdan gelen parametre dizesi ile değiştirilir.

    Demek PowerShell komut dosyasına Uyarı parametreleri kullanılabilir yapmalıdır. Şimdi yapmanız gereken tek şey zaten tanımladığınız işlevi çağırmak. (Fonksiyon tanımı sonra) Senaryonuzun sonuna aşağıdaki ekleyin:

    # Get parameter values by position and pass them to the SendMail() function. 
    SendMail $args[0] $args[1] $args[2] $args[3] $args[4] 
    

    $args biz planlanan yapılandırılmış tam olarak ne komut satırından adlı bir komut dosyası geçirilen parametre değerleri içeren bir dizidir görev yapmak.

    Uyarı, her zaman aynı değerleri aynı sırayla, yani ad, tarih, sayaç, eşik ve değer olarak göndereceğini bildiğimiz için, bunları yalnızca konuma göre komut satırı bağımsız değişkenlerinden alabiliriz ve bunları SendMail() işlevi. Orada more robust ways komut satırı argümanları işlemek, ancak bu amaçlar için yeterli olması gerektiğini

    Not.

    +0

    Wow! Teşekkürler @Matt ayrıntılı açıklama !! Ben gerçekten takdir ediyorum! Ancak, çalışıp çalışmadığımı test edemiyorum çünkü betiğimi çalıştırırken aşağıdaki hata mesajını alıyorum: "1" argümanı ile "Gönder" çağrısında bulunan özel durum: "Posta gönderme hatası . "(satır için SmtpCli ent.Send ($ MailMessage)). Buna neden olan nedir ve nasıl gideririm? – Anna

    +0

    Boşver! Sorun şu ki, sadece "blah.bleh" olması gerektiğinde smtp istemcimi "SMTP.blah.bleh" olacak şekilde ayarladım :) – Anna

    +0

    Sonunda komut dosyasını düzgün bir şekilde e-posta göndermek için aldım (YAY !!!) . Ancak parametreler e-postada geçirilmiyor.Yani bu e-postanın organıdır: = 0D = 0AThe aşağıdaki sayaç ihtiyacı dikkat:

    == 0D = 0AName: $ (Arg0)
    = 0D = 0ADate:
    = 0D = 0ACounter:
    = 0D = 0AThreshold: =
    = 0D = 0AActual Değeri:
    = 0D = 0A = 0D = 0A = 0D = 0A
    == 0D = 0A --- otomatik 0D SENDMAIL'I fonksiyonu ile --- = oluşturulan = 0A = = 0D = 0A. Sayaç "% İşlemci Süresi", Eşik 10 olmalıdır ve gerçek değer 50 civarında olmalıdır. Herhangi bir düşünce? – Anna