#電子のブログ

仕事したくない外資系 IT エンジニアの雑記

PowerShell で特定のイベント ID のメッセージで、ある文字が含まれているイベントを抽出するスクリプトを作ってみた

今日は珍しく技術系。
ちょっと色々とあり、Windows 環境で無効化されたサービスを調べる必要があった際に作ったスクリプトをご紹介します。

どんなスクリプト?

特定のイベント ID をもつイベントで、特定の文字列を含んだものだけを抽出するというものになります。
今回であれば、System イベント ログのイベント ID : 7040 でサービスのステータスが変更された内容が記録されることがわかっていますので、これを絞り込む内容を作ります。



作ったスクリプト

結論から。
作ったスクリプトは以下の内容になります。

$Logs = Get-WinEvent -FilterHashTable @{LogName = "調べたいログの名前"; Id = "調べたいイベント ID"}
$Result = @()
foreach ($log in $Logs){
    $str = $log.Message
    if ($str.Contains("調べたい文字列")){
        $Result = $Result + $log
    }
}
$Result | Format-List

※ 使いまわしていただいても構いませんが、動作を保証するものではありません。
使いまわしたことによって生じるいかなる損益も当方では補償できかねますことをご了承ください。

当スクリプトの注意点として、$str.Contains に記載している調べたい文字列が日本語の場合、ps1 ファイルは BOM付UTF-8 で保存しましょう。
アルファベットや数字の場合は問題なかったのですが、日本語の場合はどうも BOMなしの UTF-8 だと動作しませんでした。



使用例

それでは実際に使ってみた結果と、サンプルとして実行してみた結果の 2 つを見てみましょう。


System イベント ログのイベント ID : 7040 に "無効" という文字列を含んだイベントを抽出する

$Logs = Get-WinEvent -FilterHashTable @{LogName = "System"; Id = "7040"}
$Result = @()
foreach ($log in $Logs){
    $str = $log.Message
    if ($str.Contains("無効")){
        $Result = $Result + $log
    }
}
$Result | Format-List
  • Before
    色々なサービスの状態が変更される様子は見えますが、無効化というワードは一切見えないくらい大量にイベントが記録されています。


  • After 先ほどのスクリプトにかけると、たった 3 つに絞り込むことができました。

めちゃめちゃすっきりしました。
(無効化されてるのは Surface サービスだけか……)


Application イベント ログのイベント ID : 1000 で 0xc0000409 の例外コードを含んだイベントを抽出する

これは先ほどよりは使い道がありそうな例かな?

$Logs = Get-WinEvent -FilterHashTable @{LogName = "Application"; Id = "1000"}
$Result = @()
foreach ($log in $Logs){
    $str = $log.Message
    if ($str.Contains("0xc0000409")){
        $Result = $Result + $log
    }
}
$Result | Format-List
  • Before
    0xc0000409 は 1 つしかみえず、あとは別のエラー コードのアプリケーション クラッシュです。


  • After
    0xc0000409 のイベントのみを抽出することができました。

楽するところは楽するためのスクリプト

今回は自分の備忘録もかねて、作ったスクリプトのご紹介をしてみました。
たまにこんな感じでスクリプト作成の紹介をしてみたりするのもいいかもですね。

ただ、あくまでこの記事は自分への備忘録がメインとなります。
流用する際には自己責任となりますこと、くれぐれもご認識いただけますと幸いです。
技術的なツッコミやコメントはウェルカムです。