我需要定期从我们的生产环境中将Windows事件日志导出为CSV。
我有一个简单的XML Config文件,其中包含我需要事件的机器列表,以及我需要检索的事件ID列表。
从这里依次循环遍历每个机器名,然后每个事件ID检索日志然后导出为CSV。我想每次执行一台机器一个CSV。
一旦我解决了所有变量,PS Command就很容易检索一个事件ID的日志
foreach ($machine in $config.Configuration.Machines.Machine)
{
$csvname=$outputlocation + $machine.Value + "_" + $datestring + ".csv"
foreach ($eventid in $config.Configuration.EventIds.EventId)
{
Get-WinEvent -ComputerName $machine.Value -ErrorAction SilentlyContinue -FilterHashTable @{Logname='Security';ID=$eventid.Value} | where {$_.TimeCreated -gt $lastexecutiondate} | export-csv -NoClobber -append $csvname
}
}
Execpt我每次都无法附加到CSV,PS 2.0显然不支持此功能。我曾尝试一次性提取所有事件ID但这似乎有点长,现在可能允许使用配置文件,但我对PowerShell相当新,所以我没有太多运气。
我还需要指定多个LogNames(系统,安全性和应用程序),并且更愿意运行一个语句而不是相同的语句3次,但我不确定如何执行此操作。
不幸的是,谷歌让我在圈子里跑。
答案 0 :(得分:1)
以下是我一起挑选的内容,允许我为选择的事件日志导出先前24小时的事件 - 我将创建一个计划任务,因此它每天都会提取。 希望这有助于其他人...
$eventLogNames = "Application", "Security", "System", "Windows PowerShell"
$startDate = Get-Date
$startDate = $startDate.addDays(-1).addMinutes(-15)
function GetMilliseconds($date)
{
$ts = New-TimeSpan -Start $date -End (Get-Date)
[math]::Round($ts.TotalMilliseconds)
}
$serverName = get-content env:computername
$serverIP = gwmi Win32_NetworkAdapterConfiguration |
Where { $_.IPAddress } | # filter the objects where an address actually exists
Select -Expand IPAddress | # retrieve only the property *value*
Where { $_ -notlike '*:*' }
$fileNameDate = Get-Date -format yyyyMMddhhmm
$endDate = Get-Date
$startTime = GetMilliseconds($startDate)
$endTime = GetMilliseconds($endDate)
foreach ($eventLogName in $eventLogNames)
{
Write-Host "Processing Log: " $eventLogName
<# - Remove comment to create csv version of log files
$csvFile = $fileNameDate + "_" + $serverIP +"_" + $eventLogName + ".csv"
Write-Host "Creating CSV Log: " $csvFile
Get-EventLog -LogName $eventLogName -ComputerName $serverName -After $startDate -ErrorAction SilentlyContinue | Sort MachineName, TimeWritten | Select MachineName, Source, TimeWritten, EventID, EntryType, Message | Export-CSV $csvFile #ConvertTo-CSV #Format-Table -Wrap -Property Source, TimeWritten, EventID, EntryType, Message -Autosize -NoTypeInformation
#>
$evtxFile = $fileNameDate + "_" + $serverIP + "_" + $eventLogName + ".evtx"
Write-Host "Creating EVTX Log: " $evtxFile
wevtutil epl $eventLogName $evtxFile /q:"*[System[TimeCreated[timediff(@SystemTime) >= $endTime] and TimeCreated[timediff(@SystemTime) <= $startTime]]]"
}
答案 1 :(得分:0)
为什么导出日志安全失败?指定的查询无效。我为每种类型的事件日志(系统,应用程序等)都得到了这个。这只发生在evtx导出中。我得到了csv文件tho` ....