none
Get-Winevent メッセージ内容からフィルターして除外するスクリプト

    質問

  • 現在、イベントを取得するPowershellスクリプトを使用しています。

    get-wineventを使用し、指定時間帯の全イベントの取得および、イベントID,ソース,レベルにて指定したイベントの除外までは可能なのですが、

    メッセージ内容のキーワードを拾って、キーワードから除外する方法も組み込みたいと考えています。

    色々と調べたのですが、toxml()でxml化したキーワードを取得する等は見つけたのですが、逆の除外する(該当のイベントを取得しない)方法が分からず、御教示頂ければと質問致します。

    現在のスクリプトを下記します。

    日時指定の内容は割愛します。

    $ErrorActionPreference = "SilentlyContinue"
    $MachineName = "192.168.1.1","192.168.1.2";

    # 監視対象外リスト
    $ExceptionFilter =
    @(
    @{
    Id = XX;
    Level = 2;
    ProviderName = "hogehoge";
    },

    @{
    Id = XXXX;
    Level = 3;
    ProviderName = "hoge";
    }

    )


    for($i = 0; $i -lt $MachineName.Length; $i++)
    {
    $FileName = $MachineName[$i] + ".txt"
    $MachineName[$i]
    $FilePath = Join-Path "D:\Event" $FileName
    try
        {
    $MachineName[$i] + "`r`nアプリケーション" | Out-File -encoding default -FilePath $FilePath

    $EventsList = get-winevent -logname Application -FilterXPath "*[System[(Level=1 or Level=2 or Level=3) and TimeCreated[@SystemTime >= $StartTime]]]" -computername $MachineName[$i]
      $Cnt = 0
        while ($Cnt -lt $ExceptionFilter.count) {
         $EventsList = $EventsList | Where-Object {-not ($_.Id -eq $ExceptionFilter[$Cnt].Id -and $_.Level -eq $ExceptionFilter[$Cnt].Level -and $_.ProviderName -eq $ExceptionFilter[$Cnt].ProviderName )}
      $Cnt++
      }

     }

                      $EventsList | Format-List -Property TimeCreated,LevelDisplayName,ProviderName,Message,Id | Out-File -encoding default -FilePath $FilePath -append


    }
    }

    スクリプトの質問に必要な記述だけ抜き出したので、「{」や「}」の数が有っていないかも知れませんが、

    上記スクリプトで、イベントIDとソースとレベルを判断しフィルターし、それ以外の警告とエラーを取得する事は出来ています。

    しかし、頻繁に出る警告でも、同じイベント・同じソース・同じレベルで、メッセージ内容に因っては、除外してはいけないイベントが有ります。

    それをメッセージ内容を指定して除外対象に出来れば、だいぶ助かるのですが、方法が分からず困っています。

    御教示頂ければ幸いです。

    以上、宜しくお願い致します。

    2017年3月14日 5:28

回答

すべての返信

  • チャブーンです。

    この件ですが、XPathの動詞に「Suppress」を使うと定義できるようです。したのページに例がありますね。

    http://blog.engineer-memo.com/2015/05/17/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%93%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%BC%E3%81%AE%E9%99%A4%E5%A4%96%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4/

    追記:「Suppress」はFilterXPathには直接はかけないようなので、xmlファイルで保存したうえ、-FilterXMLオプションで定義する、ということになりそうです。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2017年3月14日 6:15
  • 上記スクリプトで、イベントidとソースとレベルを判断しフィルターし、それ以外の警告とエラーを取得する事は出来ています。
    しかし、頻繁に出る警告でも、同じイベント・同じソース・同じレベルで、メッセージ内容に因っては、除外してはいけないイベントが有ります。
    それをメッセージ内容を指定して除外対象に出来れば、だいぶ助かるのですが、方法が分からず困っています。

    EventLogを取得する際、XPathによるフィルタリングができ既に-FilterXPathパラメーターで指定されていますが、ここで使用可能なXPathには制限があります。

    XPath 1.0 limitationsにまとめられていますが、正直かなり厳しい制限がかけられていて、特に文字列を扱う関数は全滅です(文字列の完全一致ならいけるかな?)。ですので、Get-WinEventでのフィルターはできず、得られた結果に対してPowerShell側でフィルターする必要があります。

    2017年3月14日 7:01
  • チャブーンです。

    正直かなり厳しい制限がかけられていて、特に文字列を扱う関数は全滅です(文字列の完全一致ならいけるかな?)。

    確かにおっしゃるとおりですね。「match」や「notmatch」に相当する設定はかなり厳しそうなので、(この件に関しては)別のやり方で行う、というのが適切そうです。

    ただ、Suppressによる除外設定自体は日本語の部ログにはあまりない(SEの雑記さんぐらい)ですので、投稿自体はそのままにさせていただきます。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年3月14日 8:30
  • 情報の御提供頂き、有難う御座います。

    内容を確認し、知識を蓄積させて頂きます。

    有難う御座いました。

    2017年3月14日 9:05
  • やはり厳しそうですか。。

    別途Powershellのスクリプトを考えてみます。

    有難う御座いました。

    2017年3月14日 9:06
  • チャブーン様、佐祐理様、

    スクリプトと格闘し始めると奥が深く、、、

    とても勉強になりました。

    色々と御教示頂き、有難う御座います。

    2017年3月14日 9:10