我正在尝试编写远程服务器上过去30天应用程序和系统事件日志的审核脚本,仅查找警告,错误或关键条目。
借鉴我在此处和其他论坛中发现的内容,我想出了:
$Date = Get-Date
$Range = $Date.AddDays(-30)
$Range = $range.ToShortDateString();
$LogName = Read-Host "Which Log? (Application, System)"
$Server = Read-Host "Please Enter Server Name"
get-eventlog $LogName -ComputerName $Server -After $range | where {$_.EntryType -eq "Error" -or $_.EntryType -eq "Warning" -or $_.EntryType -eq "Critical"}
这似乎运行得相当快,但是在返回提示之前会挂起几(5-10 +)分钟,如果确实如此....
注意:如果我删除代码:
-After $range
我可以简单地用ctrl-c打破输出并继续我的一天,但我宁愿按预期运行然后停止......
所以:关于如何消除这种情况的任何想法都挂了? 我也对如何使代码更优雅(更快)的想法持开放态度! 而且我不介意脚本检查应用程序和系统日志而不必运行两次....
答案 0 :(得分:2)
使用-EntryType
上的Get-EventLog
字符串数组参数比检索整个事件日志然后使用Where-Object
尝试get-eventlog -Logname System -EntryType ("Error", "Warning")
但是......如果我在-EntryType
数组中加上“Critical”,我会得到:The argument "Critical" does not belong to the set "Error,Information,FailureAudit,SuccessAudit,Warning" specified by the ValidateSet attribute.
这让我想知道你是否应该听从Get-Help Get-EventLog
中列出的建议:
包含EventLog名词(EventLog cmdlet)的cmdlet可以正常工作 仅适用于经典事件日志。从使用该日志的日志中获取事件 Windows Vista及更高版本的Windows事件日志技术 Windows,使用Get-WinEvent。
使用Get-WinEvent
代替,我认为这就是你想要的:
Get-Winevent -FilterHashtable @{LogName="System","Application"; Level=1,2,3; startTime=$range}
这将检查级别1,2或3(分别为严重,错误,警告)的事件,并在同一调用中搜索应用程序和系统日志。
答案 1 :(得分:2)
我发现,对于远程系统,如果我将它包装到Invoke-Command中,我可以使用相同的命令一次查询多个系统。这是我的解决方案。系统越多,节省的时间就越多。 YMMV
$command = {Get-EventLog -LogName Application -After (Get-Date).AddHours("-24")}
Invoke-Command -ComputerName "foo1","foo2","foo3","foo4" -ScriptBlock $command