最近要將每月的報告自動化,所以使用PowerShell來取得一些記錄,要取得的記錄是事件檢視器前一個月的「應用程式」、「安全性」、「系統」各個的錯誤事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$month = Get-Date -Format 'MM'
$year = Get-Date -Format 'yyyy'
$dir = 'EventLog'
if($month -eq 1){
$year = $year-1
$month = 12
}else{
$month = $month-1
}

$last = [DateTime]::DaysInMonth($year, $month)
$first = Get-Date -Day 1 -Month $month -Year $year -Hour 0 -Minute 0 -Second 0
$last = Get-Date -Day $last -Month $month -Year $year -Hour 23 -Minute 59 -Second 59
$hostIP = ([System.Net.DNS]::GetHostAddresses($env:COMPUTERNAME) |Where-Object {$_.AddressFamily -eq "InterNetwork"} | select-object IPAddressToString)[0].IPAddressToString
$events=@('Application','System','Security')

Function EventLogger($message){
$nowTime = get-date -Format 'yyyy-MM-dd HH:mm:ss'
Write-Output $nowTime $message >> $env:USERPROFILE\EventLog.log
}

try{
Foreach($eventName in $events){
switch($eventName){
"Security" {
$info = Get-EventLog Security | Where-Object {$_.TimeGenerated -ge $first -and $_.TimeGenerated -le $last} | Where-Object {$_.EntryType -eq 'FailureAudit'}
}
Default {
$info = Get-WinEvent -FilterHashtable @{
LogName=$eventName;
Level=1,2;
StartTime=$first;
EndTime=$last;
}
}
}

if($info.Count -ne 0){
$info | Export-Csv -Path $env:USERPROFILE\$env:COMPUTERNAME-$hostIP-Log-$year$month-$eventName.csv -Encoding "UTF8"
}else{
EventLogger $eventName' no event records'
}
EventLogger $eventName' scan end'
}
}catch{
EventLogger $Error[0].Exception
}