直しを入れてみた
前回のスクリプトでは、切り出したログを処理すると、対応するログオンIDが見つからないことがあり、ホスト名やIPが空欄になる現象が発生していた。
そこで、後から確認するためにログオンIDをフィールドに付加する仕様に変更した。
こうすることで、手動で該当するログとの突き合わせが可能になる。切り出したcsvだけだと情報が欠落してしまい、再度全部チェックしないといけなくなるを避けるためだ。
さらに仕様変更
ログファイルは、キーボードから入力(といっても、Drag&Dropで入力できるので面倒ではないのだけれど)して、画面に出力していたものを、直接csvファイルに落とすことにした。
ファイル名も面倒なので、入力したログファイルの拡張子をcsvに変更するだけにした。
まあ、少しは手間が省けることでしょう。
ということで、以下がそのスクリプトの全体。
今のところ、最低限のチェックしか入れていないので、暇があれば修正をしようと思う。
誰かのお役に立てれば幸いですが…。
#requires -version 2.0
# 2012/10/04 add field logon-id
# direct write csv-file
function GetValue([String]$category, [String]$key, [String[]]$properties)
{
$b = $false;
foreach ($property in $properties) {
if ($b -eq $false) {
if ($property.contains($category)) {
$b = $true;
continue;
}
} else {
if ($property.contains($key)) {
return [String]$property.Substring($property.IndexOf(":")+1).Trim();
}
}
}
return "";
}
function ConvertACL([string]$accessList)
{
return $accessList.trim();
}
function GetLogonInfo([String]$logonid, [Object[]]$entrys)
{
foreach ($entry in $entrys) {
$properties = $entry.Message.Split("`n");
#ID4663のログオンIDとID4624のログオンIDが一致するかどうか
if ($logonid -eq (GetValue "新しいログオン:" "ログオン ID:" $properties)) {
return (GetValue "ネットワーク情報:" "ワークステーション名:" $properties), `
(GetValue "ネットワーク情報:" "ソース ネットワーク アドレス:" $properties);
}
}
return "","";
}
#初期エントリポイント
$archive = Read-Host "Archive log file name";
if(Test-path $archive){
$filename = $(Get-childitem $archive).name
$name = $filename.split(".");
if($name[1] -ne "evtx"){
write-output "イベントログではありません。";
exit 1;
}
$csvfile=$name[0]+".csv";
}else{
write-output "ファイルが存在しません";
exit 1;
}
$logons = Get-winevent -Path $archive | Where-Object { $_.ID -eq '4624' };
$acslogs = Get-winevent -Path $archive | Where-Object { $_.ID -eq '4663' };
$i = 0;
Add-content -Path $csvfile -Value "日時,ユーザ名,ログオンID,ドメイン名,コンピュータ名,IPアドレス,ファイル名,操作,アプリケーション";
foreach ($entry in $acslogs) {
$i = $i + 1;
Write-Progress -Activity "Outputting Event" `
-Status "Progress:" -PercentComplete ($i/$acslogs.count*100);
$properties = $entry.Message.Split("`n");
$csv = [String]$entry.TimeCreated.ToString("yyyy/MM/dd HH:mm:ss");
$csv = $csv+","+(GetValue "サブジェクト:" "アカウント名:" $properties);
$csv = $csv+","+(GetValue "サブジェクト:" "アカウント ドメイン:" $properties);
$logonid = (GetValue "サブジェクト:" "ログオン ID:" $properties);
$logoninfo = (GetLogonInfo $logonid $logons);
$csv = $csv+","+$logonid
$csv = $csv+","+($logoninfo[0]); #ワークステーション名
$csv = $csv+","+($logoninfo[1]); #ソースネットワークアドレス
$csv = $csv+","+(GetValue "オブジェクト:" "オブジェクト名:" $properties);
$csv = $csv+","+(ConvertACL((GetValue "アクセス要求情報:" "アクセス:" $properties)));
$csv = $csv+","+(GetValue "プロセス情報:" "プロセス名:" $properties);
Add-content -Path $csvfile -Value $csv;
}
exit 0;
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。