Windows PowerShell でイベントログを取得する 2

前回の続き。

参照されて処理を実行するスクリプト、実行スクリプトに引数を渡すスクリプト、サーバの定義が書いてあるxmlに別けて実装。

#==================================================
# イベントログ取得スクリプト
# 3日前までのイベントログを取得する
#==================================================

#--------------------------------------------------
#GetEventlog.ps1
#         第1引数:対象端末名
#         第2引数:イベントログ名(Application,System)
#--------------------------------------------------


function GetEventlog ([string]$_servername, [string]$_eventlogname)
{

    #変数定義---------------------
    $scriptName = "イベントログ取得スクリプト"
    #XMLファイル
    $XML = "C:\hogehoge\config\serverlist.xml"
    #引数
    $servername = $_servername
    $eventlogname = $_eventlogname
    #期間の設定
    $startdate = get-date
    $enddate = $startdate - (new-timespan -day 3)
    #ログファイルの出力先
    $filetime = get-date -format yyyyMMddhhmmss
    $file = "C:\temp\" + $servername + "_" + $eventlogname + "_" + $filetime + ".txt"

    
    try
    {
        #イベントログに開始ログを出力---------------------
        Write-EventLog "Application" "PowerShell Script" 0 -Message ($scriptName + "開始" + "`n" + "対象端末名は " + $servername + " です。" + "`n" + "対象イベントログは " + $eventlogname + " です。") -EntryType "Information"
        
        #XMLファイル読み込み---------------------
        $xmlDoc = [XML](Get-Content $XML)
        #XMLファイルの子要素を取得
        $config = $xmlDoc.get_DocumentElement()
        $childs = $config.get_ChildNodes()
        #xmlから値の取り出し
        #IPアドレス
        $ipaddress = $config.SelectSingleNode("server[@name='$servername']").ipaddress
        
        
        #イベントログ取得---------------------
        $logArray = get-eventlog -computername $ipaddress -logname $eventlogname -after $enddate -before $startdate | Select-Object EntryType,EventID,Source,TimeGenerated,Message
        
        #取得したイベントログをファイルに書き込む---------------------
        foreach ($row in $logArray){
            #Messageに入っている改行コードを変換
            $workMessage = [string]$row.Message.Replace("`n"," ")
            #日付の書式を整形
            $workTimeGenerated = [string]$row.TimeGenerated.ToString("yyyy/MM/dd HH:ss:mm")

            #タブ区切りで一行としてまとめる
            $line = $workTimeGenerated + "`t" + [string]$row.EntryType + "`t" + [string]$row.EventID + "`t" + [string]$row.Source + "`t" + $workMessage

            #ファイルに書き込む
            $line | Out-File -filepath $file  -Append
        }
        
        #ファイルの存在チェック---------------------
        if (test-path $file)
        {
            #イベントログに終了ログを書き込む
            Write-EventLog "Application" "PowerShell Script" 0 -Message ($scriptName + "`n" + $file + "`n" + "を作成しました。") -EntryType "Information"
        } else {
        	#イベントログにファイルが無いことを書き込む
        	Write-EventLog "Application" "PowerShell Script" 0 -Message ($scriptName + "`n" + $file + "`n" + "が作成されていません。") -EntryType "Warning"
        }
    }
    catch [exception]
    {
        #イベントログに書き込んで終了
        Write-EventLog "Application" "PowerShell Script" 1 -Message ($scriptName + "`n" + $error[0]) -EntryType "Error"
    }
    finally
    {
        #イベントログに終了ログを書き込む
        Write-EventLog "Application" "PowerShell Script" 0 -Message ($scriptName + "終了" + "`n" + "対象端末名は " + $servername + " です。" + "`n" + "対象イベントログは " + $eventlogname + " です。") -EntryType "Information"
    }
    
}

上記「GetEventlog.ps1」は、引数に「端末名」と「イベントログ名」(Application,Systemなど)をもらい実行されるスクリプト
このファイルを「C:\hogehoge\script」に配置しておく。

途中で端末名とIPを紐付けるserverlist.xmlを読み込んでいるが、xmlの中身はこんな↓感じ。

  • サーバの定義が書いてあるxml
<?xml version="1.0" encoding="utf-16"?>
<config>
    <server name="hogehoge1">
        <ipaddress>192.168.1.1</ipaddress>
    </server>
    <server name="hogehoge2">
        <ipaddress>192.168.1.2</ipaddress>
    </server>
</config>

んで、GetEventlog.ps1を実行するスクリプト

#==================================================
# イベントログ取得スクリプト
#==================================================

#--------------------------------------------------
#GetEventlog
#         第1引数:対象端末名
#         第2引数:イベントログ名(Application,System)
#--------------------------------------------------

#インクルード
. C:\hogehoge\script\GetEventlog.ps1

#引数
$_servername = "hogehoge1"
$_eventlogname = "Application"

#実行
GetEventlog $_servername $_eventlogname

出力される実行結果テキストは以下な感じ。

2012/06/18 12:00:01	Information	6013	EventLog	システムの稼働時間は 98037 秒です。
2012/06/18 08:46:35	Warning	36	W32Time	ソース 'W32Time' のイベント ID '-2108030940' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DLL ファイルがローカル コンピュータに存在しない可能性があります。または、これらのデータへのアクセス許可がユーザーに与えられていない可能性があります。次の情報はイベントの一部です:'86400'
2012/06/18 00:31:35	Error	48	W32Time	ソース 'W32Time' のイベント ID '-2108030928' の説明が見つかりません。必要なレジストリ情報またはメッセージを表示するメッセージ DLL ファイルがローカル コンピュータに存在しない可能性があります。または、これらのデータへのアクセス許可がユーザーに与えられていない可能性があります。次の情報はイベントの一部です:'time.windows.com,0x1', '到達できないホストに対してソケット操作を実行しようとしました。 (0x80072751)', '960'

後は、引数を渡すスクリプトを 端末数 × イベントログの数 だけ用意すれば良い感じにしてみた。

と、windowsのメモ帳で開くと良い感じなんだけどsakuraエディタみたいなので開くと改行コードが色々で、変な所で改行されてたりする。。。

ココらへんの改修はまた今度(´・ω・`)